Keil MDK下学习STM32注意事项

转自 :http://blog.sina.com.cn/s/blog_6bd352290101b7tx.html


      在MDK下学习使用STM32也快两个礼拜了,基本掌握了STM32在MDK环境下的开发流程和基本硬件程序的书写。其间,遇到了许多问题,其中不少问题花费了我相当多得时间才得以解决,现将这些问题和解决方法列出。其中也有一些是学习过程中我觉得需要记下的注意事项。


1、STM32固件库使用外围设备的主要思路
 
      在STM32中,外围设备的配置思路比较固定。首先是使能相关的时钟,一方面是设备本身的时钟,另一方面如果设备通过IO口输出还需要使能IO口的时钟;最后如果对应的IO口是复用功能的IO口,则还必须使能AFIO的时钟。
 
其次是配置GPIO,GPIO的各种属性由硬件手册的AFIO一章详细规定,较为简单。
 
接着相关设备需要如果需要使用中断功能,必须先配置中断优先级,后文详述。
 
然后是配置外围设备的相关属性,视具体设备而定,如果设备需要使用中断方式,必须使能相应设备的中断,之后需要使能相关设备。
 
最后如果设备使用了中断功能,则还需要填写相应的中断服务程序,在服务程序中进行相应操作。

2、如果在源文件中未定义以下预定义,需在工程“C/C++”中预定义一栏 填写 “USE_STDPERIPH_DRIVER,STM32F10X_CL(器件所属分类),USE_STM3210C_EVAL(使用的评估板,库自带的历程中需要根据"readme"文件提示添加,自己的工程除非是在一样的评估板上运行,否则不需要预定义此项)”

3、NVIC的优先级分组
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);   //这个对所有中断有效,一个程序中只能有一个分组
 

NVIC_PriorityGroup_n中n代表4位中有n位是给中断分配抢占式优先级的,4-n位是给中断分配响应优先级的。

4、NVIC_InitStructure.NVIC_IRQChannel =EXTI15_10_IRQn;//其中EXTI15_10_IRQn表示选中的通道为[15:10],
不懂就跳到它的定义处看注释

5、TIM_TimeBaseStructure.
   TIM_ClockDivision=TIM_CKD_DIV4中的TIM_ClockDivision或 控制寄存器1(TIMx_CR1)中得位CKD[1:0] 为 时钟分频因子 (Clock division) 
  为定义在定时器时钟(CK_INT)频率与数字滤波器(ETR ,TIx)使用的采样频率之间的分频比例,与用内部时钟时counter使用的时钟频率(分频是在PSC寄存器中设置)无关。

6、下面对该库文件做个简单介绍:
      Libraries\STM32F10x_StdPeriph_Driver\下的内容很好理解就是stm32的各个外设模块驱动代码。
      misc.h和misc.c是和CM3内核有关的NVIC和SysTick的驱动代码。   
      Libraries\CMSIS下是什么呢?cmsis英文全称:Cortex Microcontroller Software Interface Standard,是Cortex系列处理器硬件抽象层,可以理解为cortex内核的软件接口。
      core_cm3.h  它们的目录名为 CMSIS  -->  include,说明这两个文件是CM3内核支撑文件,其他使用CM3内核的芯片也可以用,不一定是stm32。这两个文件用来获取设置CM3内核,配置一些内核寄存器。
      stm32f10x.h, system_stm32f10x.c,system_stm32f10x.h和startup_stm32f10x_hd.s,这几个文件是和具体的芯片有关的,也就是stm32芯片的支撑文件。其中stm32f10x.h是标准外设库的入口,使用标准外设库的代码中必须包含该头文件。system_stm32f10x.c,system_stm32f10x.h这两个文件提供函数用来初始化stm32芯片,配置PLL、系统时钟和内置flash接口。startup_stm32f10x_hd.s是大容量型stm32芯片的启动文件。
 

7、USER下部分文件介绍
    (1)stm32f10x_conf.h是用来添加所需外设头文件的,要根据需要进行更改,否则编译会出现很多提示外设库函数没有定义 的错误。
    (2)stm32f10x_it.c这是一个中断处理文件,_it结尾,就是interrupt(中断)的意思,说明这个是整个工程的中断处理函数,要是楼主没有用到中断的话就可以不添加进去,还有,也可以去掉,将中断函数添加到其它.c文件里也行.
        stm32f10x_it.h中是对中断处理函数的声明。
    (3)System_stm32f10x.c这个文件中定义的单片机的时钟设置,修改时钟设置直接修改里面的相应宏定义即可。调用System_Init()函数时会调用这个宏定义。由于在STM32的启动代码中(eg.starup_stm32f10x_cl.s)就调用了System_Init()函数,因此在主函数中不需调用此函数。


8、24C02器件地址组成
    八位前面4位代表器件类型,eeprom为1010,A2、A1、A0为同类型器件地址,主要看原理图中相应位是接高还是接地。
    eg.由STM32  HY-GoldBullV3开发板的原理图可知,24C02的A2、A1、A0脚全部接地,所以24C02的地址应为1010000_  ,最后一位表示读还是写。

9、在一个源文件中调用其他文件的函数,也需要在文件头声明,不然会有警告。

10、使用串口出现乱码
    原因分析(1)USART设置有错(2)系统时钟设置有误(3)如果使用的是MDK,使用printf()函数需要在工程属性的“Target“-》”Code Generation“中勾选”UseMicroLIB“,否则使用printf函数会出现问题,例如会出现乱码。

11、如果错误提示“expect a ")" "   原因有可能为(1)少写了半个括号 ")"   (2)输成中文输入法的括号 (3)定义了与宏定义重复的变量其中第三个最不容易发现,平常写程序时要注意。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值