【菜鸟入门】stm32的第一个程序--LED

时间:2023-02-20 11:00:25

经过今天一天的努力终于完成了我的stm32第一个程序;我也是今天才开始接触stm32。

由于苦于没有资料,木有例程,找到的例程都是带有库的,这样对stm32基础的管脚配置就不容易懂了,主要是没有一个具体的轮廓。

经过对库文件的研究,和看了好几节视频,又根据自己以前搞430和arm9的经验,就按着以前的思路进行研究,终于开发出自己的第一个LED程序;

1、创建工程

(1)Project  -->   New uvision Project 

(2)选择工程要保存的地方

(3)选择CPU

(4)选择“是”(如果你使用从STM下载的库的话,就选“否”)

【菜鸟入门】stm32的第一个程序--LED

(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 按照如下设置

【菜鸟入门】stm32的第一个程序--LED

这样算是大致设置好了。


2、编写时钟初始化程序

【菜鸟入门】stm32的第一个程序--LED

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;
}

【菜鸟入门】stm32的第一个程序--LED

具体数值为什么这么配置,请看寄存器

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;【注:感谢@大黄同学的帮我指出错误!!可以看下下面的寄存器】

【菜鸟入门】stm32的第一个程序--LED

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;//
}
}