本文介绍如何使用keil从零开始一个简单的STM32项目,然后闪烁指示灯以显示给kwdjm。
第零步当然,首先必须有STM32的板子。 那个IO口连接着LED。
第一步,创建文件夹0.0
打开第二步,keil,启动项目
在显示的对话框中选择您的STM32芯片。
如果在接下来出现的对话框中选择“是”,keil会为您创建启动文件。
第三步,创建新的main.c文件并将其添加到项目中。
单击“新建”按钮创建文本文件。
在创建的文本文件中输入c的main函数
点击保存
保存后,向项目中添加文件
第四步,点击编译
可以看到keil报告了错误
错误消息没有定义名为SystemInit的符号。 这是因为在启动文件中调用了SystemInit函数,但未定义如下图所示。
可以暂时忽略上述启动文件中装配的含义,只需将函数添加到main.c中即可消除错误。
修改并编译后,程序没有报告错误。 至此,一个STM32的工程完成了。
第五步
#defineperiph_base(unsignedint )0x40000000 ) define AP B2 per iph _ base0x 10000 ) definegpioa _ base dfinine ase ) APB2perIPH_base0x1000 ) definegpiod_base ) APB2perIPH_base0x1000 ) ) definegpiod _ b definegpioe _ base (AP B20x1c00 ) definegpiog_base ) APB2perIPH_base0x1c00 ) definegpiog _ base dfinegpioa _ ODR _ addr (gpioa _ base 12 )/0000x 40010 c0c0x 4001100 c# definegpiod _ ODR _ addr (gpiod _ base 12 )/0x 4001140 c # definegpioe _ ODR _ addr ) gpioe _ base 1140 definegpiog_ODR_addr ) gpiog_base12 )/0x 40011 e0c bit num ((addr0x f 000000 )0x2000000 ) ) addr0xfffff )5) bitnum2 definemem_addr ) ) volatileunsignence efineled0mem _ addr (bit band (gpioa _ ODR _ addr,8 ) )/#defineled0* () volatile unsigned int CFGR; volatile unsigned int CIR; volatile unsigned int APB2RSTR; volatile unsigned int APB1RSTR; volatile unsigned int AHBENR; volatile unsigned int APB2ENR; volatile unsigned int APB1ENR; volatile unsigned int BDCR; volatile unsigned int CSR; } RCC_TypeDef; #defineRCC(RCC_typedef* )0x40021000 ) typedef struct { volatileunsignedintcrl; volatile unsigned int CRH; volatile unsigned int IDR; volatile unsigned int ODR; volatile unsigned int BSRR; volatile unsigned int BRR; volatile unsigned int LCKR; } GPIO_TypeDef; #definegpioa(gpio_typedef* ) gpioa _ base (voidledinit ) void ) {RCC-APB2ENR|=12; //GPIOA时钟接通GPIOA-CRH=0XFFFFFFF0; GPIOA-CRH|=0X00000003; //void delay _ ms (volatileunsignedintt ) ) {unsigned int i,n; for(n=0; nt; n ) for(I=0; i800; I; }intmain(void ) ) {LEDInit ); wile(1) {LED0=0; elay_ms(500; LED0=1; elay_ms(500; }语音系统(语音) }
下一段是代码的简单说明,但不需要解释得太深。
/
STM32 GPIO输出高低电平的完整流程如下。
配置时钟配置IO口IO口输出高地电平
1,STM32的时钟可以PLL。 但是,为了简化操作,这里不放置,只使用默认时钟——内部8MZH振荡器。
2、从硬件上看,我的LED灯与PA8连接。 那么,怎么控制PA8?
STM32不能像单片机一样立即操作IO端口。 要操作STM32上的IO端口,请先配置IO端口。
语音识别(语音) )
{
RCC-APB2ENR|=12;
GPIOA-CRH=0XFFFFFFF0;
GPIOA-CRH|=0X00000003;
}
其中RCC-APB2ENR|=12; 这是启用GPIOA的时钟。 如果是启用GPIOB的时钟,则RCC-APB2ENR|=13; 其他用这个类推。
GPIOA-CRH=0XFFFFFFF0;
GPIOA-CRH|=0X00000003;
将PA8配置在推挽输出、50MHZ处。
设定PA9时:
GPIOA-CRH=0XFFFFFF0F;
GPIOA-CRH|=0X00000030;
另外,如果是PA0~PA7,则将CRH变更为CRL即可。
如果要设置其他GPIO端口,请将GPIOA更改为GPIOB、GPIOC。 没关系。
据了解,3,51单片机可以单独控制各个IO端口。 STM32也可以做。 该机制称为Bit-Bond。
参照 《Cortex-M3权威指南》 ,可知只要找到PA8输出寄存器的Bit-Bond中的地址,就可以操作PA8的输出。 地址的计算方法如下图所示。
《Cortex-M3权威指南》 还介绍了如何定义c语言宏,可以直接使用。
/
输入上述代码后,打开配置选项并配置为:
选中Create HEX File
选择J-Link下载工具
再build一次,下载就完了。
综上可知,如果不配置STM32的PLL,对于51单片机,STM32闪烁LED灯仅增加了一个将GPIO端口作为输出进行配置的步骤。
转载于:https://www.cn blogs.com/weynechen/p/4846792.html