【菜鸟入门】stm32的第一个程序–LED
最后更新于:2022-04-01 14:50:33
经过今天一天的努力终于完成了我的stm32第一个程序;我也是今天才开始接触stm32。
由于苦于没有资料,木有例程,找到的例程都是带有库的,这样对stm32基础的管脚配置就不容易懂了,主要是没有一个具体的轮廓。
经过对库文件的研究,和看了好几节视频,又根据自己以前搞430和arm9的经验,就按着以前的思路进行研究,终于开发出自己的第一个LED程序;
1、创建工程
(1)Project --> New uvision Project
(2)选择工程要保存的地方
(3)选择CPU
(4)选择“是”(如果你使用从STM下载的库的话,就选“否”)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-21_576915b0b2b38.jpg)
(5)修改一下代码(如果不注视掉红色部分,会出现错误)
~~~
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
;IMPORT SystemInit
;LDR R0, =SystemInit
;BLX R0
LDR R0, =__main
BX R0
ENDP
~~~
(6)加入定义
Flash --> Flash config tools --> C/C++ -->
在Defines里面添加:STM32F10X_HD
不然也会提示错误!
(7)Jlink下载设置(如果你用的是Jlink可以设置下)
在(6)的Flash config tools中的Debug中选中use [J-LINK / J-Trace Cortex ] -->Setting --> Flash Download 按照如下设置
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-21_576915b0d40f8.jpg)
这样算是大致设置好了。
2、编写时钟初始化程序
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-21_576915b102105.jpg)
~~~
int sys_init(unsigned char PLL)
{
unsigned char temp = 0;
RCC->CR |= 1<<16; //OPEN HSE
while(!(RCC->CR>>17));
RCC->CFGR = 0x04<<8; //APB1 HSE/2
PLL -= 2; //9-2 = 0111b
RCC->CFGR |= PLL << 18; //0111 ==> X9
RCC->CFGR |= 1 << 16; //PREDIV1 ouput as source of PLL
FLASH->ACR |= 0x32; //With
RCC->CR |= 1<<24; //enable PLL [24bit]
while(!(RCC->CR >> 25));
RCC->CFGR |= 0x2<<0;//PLL As System Clock
while(temp != 0x02)
{
temp = RCC->CFGR >> 2;
temp &= 0x03;
}
return 0;
}
~~~
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-21_576915b102105.jpg)
具体数值为什么这么配置,请看寄存器
3、延时函数
为了实现准确延时,我们选用SysTick
~~~
void delay_ms(int timeout)
{
u32 temp = 0;
SysTick->CTRL = 0xfffffffb;
SysTick->LOAD = timeout*9000;
SysTick->VAL = 0x00;
SysTick->CTRL = 0x01;
do{
temp = SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL = 0x00;
SysTick->VAL = 0x00;
}
~~~
这里的timeout不能超过一个值,具体多大可以自己计算下;
LOAD为24位 0xffffff/9000 = timeout_max;【注:感谢@大黄同学的帮我指出错误!!可以看下下面的寄存器】
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-21_576915b149540.jpg)
STK_LOAD可用位数为[23:0];【再次感谢大黄!!!】
4、LED灯的控制
我的板子LED灯与stm32的pin是这样对应的
LED1 --> PE1
LED2 --> PE0
LED3 --> PE2
LED4 --> PE3
我这里准备对LED2/PE0进行操作
~~~
int main()
{
sys_init(9); //系统时钟初始化72M = 8M X 9
RCC->APB2ENR |= 1<<6; //使能GPIOE的时钟
GPIOE->CRL &= 0xFFFFFFF0;//清除PE0的控制位
GPIOE->CRL |= 0x00000003; //选用输出模式 --->50MHz
GPIOE->ODR |= 1<<0;//设置PE0位输出模式
//GPIOE->BRR = 1<<0;//设置PE0输出的电平
while(1){
delay_ms(1000);
GPIOE->BRR = 1<<0;//
delay_ms(1000);
GPIOE->BSRR = 1<<0;//
}
}
~~~