前言
我们拿到一块单片机最小系统板,想要用它来作为平衡小车的功能控制,那么,我们必须弄清楚以下几点: 首先,这块板子的功能是否是完全正常,其上的外设是否满足我们的需求? 其次,在我们的知识范围内,我们所需要的模块功能能否正常调用出来? 最后,这些调用的功能模块能否协调工作,完成我们所需的所用任务指标? 接下来,我们逐一解决上述的各个问题:) PS: 以STM32F103RCT6为例, 其他板子测试方式与此基本一致。
一、 STM32F103RCT6最小系统板
1.1 STlink程序烧录
在上图中可以看到两个BOOT引脚,它们是用来配置最小系统板的启动模式的。
1.1.1 模式选择
- Main Flash memory
这是STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。(在此次测试中,我们选择stlink烧录,配置成BOOT1=0、BOOT0=0即可正常烧录,后续知识均为补充) - System memory
从系统存储器启动,这种模式启动的程序功能是由厂家设置的。一般来说,这种启动方式用的比较少。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说的ISP程序, 这是一块ROM,出厂后无法修改。一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。但是这个下载方式需要以下步骤: Step1:将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader Step2:最后在BootLoader的帮助下,通过串口下载程序到Flash中 Step3:程序下载完成后,又有需要将BOOT0设置为GND,手动复位,这样, STM32才可以从Flash中启动。 - Embedded Memory
内置SRAM,既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。假如我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比较的费时,可以考虑从这个模式启动代码(也就是STM32的内存中),用于快速的程序调试,等程序调试完成后,在将程序下载到SRAM中。
1.2 烧录功能测试
由于此款最小系统板上没有CH340模块,即无法将USB的电平信息成串口所需电平进行传递,无法通过串口烧录(FlyMcu软件)。因此,我们只能选择stlink或者jlink烧录——
- 配置最小系统板模式为BOOT1=0、BOOT0=0
- 有时烧录后无对应现象出现,可以再次复位, 使得stm内置的Flash重新启动,而后观察现象。
1.2 点亮一个LED灯
我们可以把最小系统板想象成上面的这么一大块芯片,配合上用排针引出的64个芯片的引脚。如果想用一个引脚控制LED灯的点亮和熄灭,我们怎么做?我们可以首先在芯片的引脚(实际上是引出的排针)旁边搭出来一个能使LED点亮的外围电路,像如下图所示的电路。
然后,我们将其中的一端交给芯片的不接地,而交给芯片的引脚控制,那么只要控制芯片的引脚输出低电平,不就相当于给LED的负极接地了吗?然后就点亮了LED灯。 反之,如果控制芯片的引脚输出高电平,那就是熄灭了LED灯。这个引脚只要是普通功能的引脚就可以使用。特殊功能的引脚一般不能直接使用(比如BOOT1引脚对应的PB2),具体可以在网络上查找stm32芯片引脚的功能如何分配的,明确哪些能用哪些不能用。 初始化对应引脚的过程与之前所学一致——设置引脚为普通推挽输出,即可轻松点灯!
1.3 测试OLED
引脚SCK、DI、RST、DC分别定义在PC6、PC7、PC8、PC9引脚上,再插入面包板中与OLED相连,即可显示。
1.4 测试PWM输出
首先,我们需要重点关注定时器的配置:PWM模式。什么时候PWM输出高电平,什么时候PWM输出低电平?stm32给了我们2种模式——PWM模式1,PWM模式2.
- PWM模式1:向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
- PWM模式2:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平(OC1REF=1),否则为无效电平(OC1REF=0)。
注意:此处的有效电平并不是指输出电平的高电平—— 输出电平的高低由OCxREF和CCXP共同决定, CC1P与REF相同则输出为1,反之输出为0。
而CCXP的极性可以由TIM_OCInitStructure.TIM_OCPolarity这一结构体参量来控制。具体信息参看stm32f10x参考手册。
其次,我们需要明白,PWM输出应该输出在哪个引脚呢?显然,输出和定时器有关,顺水推舟,输出的引脚也一定是和定时器的某个通道存在复用关系(Alternative Function),由此,我们只需要在原理图中找出一个合适的引脚,对其初始化GPIO、以及TIM_CHx的模式即可。
以上图为例,所示的PB0、PB1分别于TIM3的通道3(TIM3_CH3)、通道4(TIM3_CH4)存在复用关系,我们以PB0输出为例——GPIO设置为复用推挽输出模式,将输出的控制权由内部的寄存器交给定时器TIM3,正常初始化即可;定时器TIM3需要设置合适的arr自动重装值 及psc时钟预分频数,设置PWM模式,并使能定时器即可,配置PWM模式按照上述原理即可配置。
#define BRE_TIMx TIM3
#define BRE_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
#define BRE_TIM_CLK RCC_APB1Periph_TIM3
#define BRE_TIM_GPIO_APBxClock_FUN RCC_APB2PeriphClockCmd
#define BRE_TIM_GPIO_CLK (RCC_APB2Periph_GPIOB)
#define BRE_GPIO_REMAP_FUN()
#define BRE_TIM_LED_PORT GPIOB
#define BRE_TIM_LED_PIN GPIO_Pin_0
#define BRE_TIM_OCxInit TIM_OC3Init
#define BRE_TIM_OCxPreloadConfig TIM_OC3PreloadConfig
#define BRE_CCRx CCR3
#define BRE_TIMx_IRQn TIM3_IRQn
#define BRE_TIMx_IRQHandler TIM3_IRQHandler
void TIMx_PWM_Init(u16 arr,u16 psc);
static void TIMx_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(BRE_TIM_GPIO_CLK, ENABLE);
BRE_TIM_GPIO_APBxClock_FUN( BRE_TIM_GPIO_CLK, ENABLE );
BRE_GPIO_REMAP_FUN();
GPIO_InitStructure.GPIO_Pin = BRE_TIM_LED_PIN ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( BRE_TIM_LED_PORT, &GPIO_InitStructure );
}
void TIMx_Mode_Config(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
BRE_TIM_APBxClock_FUN ( BRE_TIM_CLK, ENABLE );
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(BRE_TIMx, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
BRE_TIM_OCxInit ( BRE_TIMx, &TIM_OCInitStructure );
BRE_TIM_OCxPreloadConfig ( BRE_TIMx, TIM_OCPreload_Enable );
TIM_ARRPreloadConfig(BRE_TIMx, ENABLE);
TIM_Cmd(BRE_TIMx, ENABLE);
}
1.5 测试串口收发数据
对于STM32F103RCT6最小系统板——PA9引脚—>U1_TXD || PA10—>U1_RXD 使用USB转TTL模块的TX、RX引脚连接在单片机最小系统班上测试引脚是否正常使用,结果显示正常,代码部分略。 注意:USB转TTL模块的GND端子与stm32开发板的GND连接在一起,即“共地”,保证电平标准一致,“3.3V”、“0V”的电压差是两个模块都能够认可的。
其余事项
MOU6050模块和电机模块的测试调试会在后续详细介绍。
二、 结尾说明
本文重点参考以下内容 a) 《stm32定时器的pwm1模式和pwm2模式的区别》
b) stm32f10x参考手册
c)MiniSTM32_V3.3_SCH.pdf
|