天天看点

基于STM32的开发板调试Review

在此之前,应该是有接触过单片机的,比如本科学习的微控制器还有嵌入式(因为我没有好好听课,所以基本等于不会)。所以就此认为这是第一次接触单片机吧。

(首先拿到单片机,应该查阅数据手册,了解有多少外设,比如ADC有几个,USART有几个,SPI有几个…)

基于STM32的开发板调试Review

目的:快速学习单片机,熟悉芯片和开发板的调试流程,为后续做系统的项目做准备。

具体内容:

1. 时钟树

单片机就像是一个小小的系统,所有的运行都需要有严格的时钟管理。看时钟树的时候能够知道系统的时钟是由谁提供的,最大频率是多少,每个时钟分频后分别分配给了谁。比如:STM32F103RC最大时钟频率是72MHZ,预分频后分配给了不同的外设。这些信息在例程库中均可找到,若分配时钟,可直接调用库函数。

2. I/O口

单片机最基本的功能即端口的输入输出,输入输出端口呈高电平、低电平或高阻态。端口作为输入时,有浮空输入,上拉或下拉,所谓上拉或下拉,即端口上拉或下拉一个电阻,而浮空即 没有电阻存在。(对于为什么要由上拉下拉电阻,我还没有弄明白)

同样,作为输出也有几种配置:开漏模式和推挽模式,一般推挽模式可以得到的电流或电压比较大。IO口还有一项最重要的作用是复用输出,作为外设的输出,比如:PA1既可作为普通IO口也可作为TIM1的通道1输出,即复用功能。I/O口的配置需要查阅数据手册。

3. 串口

串口作为一项外界与单片机的交流通讯工具,在掌握的过程中是非常有必要的。通讯主要有USART,SPI和I2C,其实就是有不同的通信协议,目前接触过USART和SPI。也仅仅只会配置它,发送和接收而已。具体有待提升。

4. 中断

中断这个概念最开始接触应该是在学微机原理的时候。对中断的理解是:在正常运行的系统中,有事件急需处理,while循环就会被打断,即来到中断,中断也有优先级高低,同过分配抢占式优先级和响应式优先级。抢占式优先级即可嵌套或被嵌套,在抢占式优先级低的中断运行时,若有优先级高的中断插入,则停下去处理优先级高的事件,等处理完即可会到被打断的地方,继续处理优先级低的中断。当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

在系统开发中,中断应该越少越好,并且中断所处理的事件应越快越好。但中断对于整个系统来说是最快速的,总是会停下来去处理中断中的事件。

5. 定时器

定时器是目前为止用的最多的一个外设,定时器功能强大,不仅可以定时,计数,还可以进行编码器模式。目前接触到的是定时,产生PWM,输入PWM(捕获模式),计数功能。

定时器最基本的定时功能是通过计数实现的,由内部时钟作为定时器的时钟源,选择分频系数,选择计数周期即可完成定时。比如:TIM2时钟源是72MHZ的,在经过分频系数7200-1之后,时钟频率变为10KHZ,若选择计数周期100,则10ms计数器溢出一次。

定时器的计数功能有三种模式,向上计数,向下计数或中心对称模式,具体的可参考手册。在无刷电机的六步换向中,由于需要检测过零点,通常会使用中心计数模式,从而在计数上溢或下溢的时候进行AD采样而进行过零点检测。

定时器产生PWM波:在输出比较模式下,有一个设置定时器脉宽的参数,即设置PWM脉宽。则占空比即等于脉宽/计数周期。通过调节脉宽即可调节PWM波。在此模式下,有两种PWM产生方式,可参阅数据手册(OC_PWM_MODE1和OC_PWM_MODE2)。

定时器的PWM输入模式(和PWM有区别):在捕获模式下,定时器可以由内部触发或外部触发,内部触发可以由其他定时器触发,比如:定时器3触发定时器2的输入捕获通道,定时器3有两个捕获通道,一个捕获上升沿一个捕获下降沿,即可输入PWM波。

定时器的输入时钟:内部时钟和外部时钟,内部时钟可以是内部AHB等此类,外部时钟源可以由外部输入构成,比如:在机器人中常用的光电码盘,通过码盘的上升沿或下降沿可以统计脉冲数,那么码盘的时序输入就是外部时钟源。

6. 无刷电机高级定时器

高级定时器TIM1和TIM8的功能除上述外,还有互补输出的功能。所谓互补输出即为直流无刷电机的上下桥臂互补输出。用于驱动直流无刷电机的全桥电路一共有三相六个mos管,每相由上下两个桥臂组成。定时器产生六路互补的信号,并设置有死区时间。死区时间是防止上下桥臂同时导通,从而使电路烧毁。高级定时器还包含有刹车功能,所谓刹车功能即是在电机出现异常信号时,及时使电机停下的功能。此功能一般在电机驱动中均会使用,但是在特殊情况,比如说无人机,四旋翼中不会使用该功能。(刹车后电机停转,四旋翼会摔下来)

7. AD采样

AD和DA转换是将外部的模拟信号量转换为数字信号传输给单片机,处理后的数字信号经DA转换变成模拟信号,从而输出。AD采样可以连续转换,也可以由外部触发转换。比如:直流无刷电机需要采样反电动势来检测过零点,而过零点的检测在需在定时器计数下溢或上溢的时刻进行。而此时就需要用外部触发来进行AD转换。AD采样得到的数据是一个12位的值,需要经过换算将其转换为电压值,比如:采样的值是3020,而12位最大值是FFF,而芯片电压最大值应该为3.3v,则采样得到的电压值应该为3.3*3020/FFF。在很多情况下,AD采样会采用DMA方式,DMA方式不占用CPU资源,具体还未实施过,等项目开始之后尝试。

8. SysTick

SysTick是系统滴答定时器,它可选择内部或外部时钟作为时钟源。若选择内部时钟源,则以Cortex(HCLK)时钟作为SysTick时钟源。而Cortex M3的时钟源为72MHz的,若选择外部时钟源,则由AHB(HCLK)经过8分频之后作为SysTick时钟源。因此,选择外部时钟源时,SysTick的时钟源是9MHz,从1计数到9即为1us,计数到9000即为1ms。SysTick有四个寄存器。具体可参见手册。(Cotex-M3权威指南和技术参考手册),所以在此基础上可以使用SysTick来作延时功能。

比如:

void delay_ms(u16 nms)          
{ 
   u32 temp; 
   SysTick->LOAD = *nms; 
   SysTick->VAL=;//清空计数器
   SysTick->CTRL=;//使能,减到零是无动作,采用外部时钟源    

   do 
   { 
      temp=SysTick->CTRL;//读取当前倒计数值
  }while((temp&)&&(!(temp&(<<))));//等待时间到达
  SysTick->CTRL=; //关闭计数器
  SysTick->VAL =; //清空计数器
}
           

对STM32调试的一般配置方式:首先配置时钟,打开系统和所有外设的时钟。其次打开相应I/O端口,供外设所使用。再之,配置相应外设。

继续阅读