🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
经过今天一天的努力终于完成了我的stm32第一个程序;我也是今天才开始接触stm32。 由于苦于没有资料,木有例程,找到的例程都是带有库的,这样对stm32基础的管脚配置就不容易懂了,主要是没有一个具体的轮廓。 经过对库文件的研究,和看了好几节视频,又根据自己以前搞430和arm9的经验,就按着以前的思路进行研究,终于开发出自己的第一个LED程序; 1、创建工程 (1)Project  -->   New uvision Project  (2)选择工程要保存的地方 (3)选择CPU (4)选择“是”(如果你使用从STM下载的库的话,就选“否”) ![](https://box.kancloud.cn/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://box.kancloud.cn/2016-06-21_576915b0d40f8.jpg) 这样算是大致设置好了。 2、编写时钟初始化程序 ![](https://box.kancloud.cn/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://box.kancloud.cn/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://box.kancloud.cn/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;// } } ~~~