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

来源:互联网 发布:温州软件外派 编辑:程序博客网 时间:2024/04/27 14:54

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

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

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

1、创建工程

(1)Project  -->   New uvision Project 

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

(3)选择CPU

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

(5)修改一下代码(如果不注视掉红色部分,会出现错误)

; Reset handlerReset_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 按照如下设置


这样算是大致设置好了。


2、编写时钟初始化程序

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/2PLL -= 2;//9-2 = 0111bRCC->CFGR |= PLL << 18;//0111 ==> X9RCC->CFGR |= 1 << 16;//PREDIV1 ouput as source of PLLFLASH->ACR |= 0x32;//WithRCC->CR |= 1<<24;//enable PLL [24bit]while(!(RCC->CR >> 25));RCC->CFGR |= 0x2<<0;//PLL As System Clockwhile(temp != 0x02){temp = RCC->CFGR >> 2;temp &= 0x03;}return 0;}


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

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


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


原创粉丝点击