×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-08-25 发布时间:
|

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


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


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


1、创建工程


(1)Project  -->   New uvision Project 


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


(3)选择CPU


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




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




这样算是大致设置好了。




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

}



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


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

    }

}

关键字:stm32  LED  管脚配置 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会