STM32F407zET6芯片总结

STM32 以前没有接触过,今年第一次接触,在搭建环境配置的时候就给了我很多下马威:

1:总是出现:C:\Keil_STM32\ARM\INC\ST\STM32F10x\stm32f10x.h(80):error:  #35:#error directive: "Please selectfirst the target STM32F10x device used inyour application (instm32f10x.h file)错误,

原来是右键点击工程名,选择第一个options for target ,下面选择C/C++,在define文本框中输入:

STM32F40_41xxx,USE_STDPERIPH_DRIVER即可。STM32F40_41xxx必须可以在system_stm32f4xx.c文件中存在。

2:出现Undefined symbolNVIC_PriorityGroupConfig NVIC_Init SysTick

原来是缺少misc.c文件

3:原来下载了keil5forarm还得下载相关的固件库文件

4:ST_Link只需4条线就可以debug分别是3.3V,GND,SWIO,SWCLK

5:选择仿真器仿真需要在两个地方分别选择:debug下的ST_Linker和Utilities下Use Target Driver for Flash Programming 的ST-Link Debugger

6:需要把debug下硬件仿真那一边的所有复选框都选上,才能问题少,我少选了run to main 就每次从startup文件开始

7:一定要把debug下的4个dll和4个parameter都填上对应的值

STM32F407zET6芯片总结_第1张图片

尤其是最下面一行,填上对应的芯片号,不要用默认的那个文件库和参数

8:C\C++下面的one ELF section per function要勾选,includepath要选择需要的头文件.h文件夹

STM32F407zET6芯片总结_第2张图片

9:target下面的Use MICROLIB一定要勾选,如果你想用printf函数输出到串口,必须勾选而且还要添加其他的函数

   int fputc(int ch, FILE *f)
   {
      USART_SendData(USART3, (unsigned char) ch);// USART1 可以换成 USART2 等
      while (!(USART3->SR & USART_FLAG_TXE));
      return (ch);

   }

函数用来发送printf内容,不然不会有显示的

STM32F407zET6芯片总结_第3张图片

9:一定要看准了芯片外部晶振频率,单片机上网口的晶振和芯片外部晶振距离不远,我把芯片晶振频率就给看成网口晶振频率25M,结果怎么调试都出现乱码,发送03 串口调试工具出现FCE0E0,郁闷死了,调了两个礼拜都不起色。看到网友说他把25M换成8M出问题我还不在乎,后来从新看电路图才发现芯片外部晶振是8M。死啦死啦。可是固件库里默认的的是25M,我就是看到25M晶振,心想不会错啊,哎哎。。。。。。。。,还有修改晶振频率后还有修改PLL_M的值因为该芯片最高晶振168Hz,如果HSE_VALUE从25改到8M,默认的168M会大打折扣,所以PLL_M 改成8,其他不动。修改的文件包括stm32f4xx.h中把25M改成HSE_VALUE8M,在system_stm32f4xx.c中的#define HSE_BYPASS_INPUT_FREQUENCY   8000000修改,#define PLL_M      8修改;系统时钟计算方式HSE_clk=(HSE/PLL_M)*PLL_N

10:如果使用串口,第一步需要找到对应的串口引脚,使能串口时钟和对应挂载串口总线时钟

第二步设置引脚复用,以及引脚输出输入模式,并初始化引脚

第三步设置串口参数,初始化串口

第四步设置中断信号,中断优先级,写中断函数

我参考的是正点原子http://www.openedv.com/posts/list/43333.htm的串口设置和PWM设置

正点原子的PWM程序没有输出,后来在PWMinit函数里添加了一句TIM_OCInitStructure.TIM_Pulse=pulse;

就能用了,因为才仿真时候发现这个CCR1的寄存器值乱跳。。。。


OK经验就总结到此为止

你可能感兴趣的:(STM32)