IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 平衡小车制作系列之三——stm32软件调试 -> 正文阅读

[嵌入式]平衡小车制作系列之三——stm32软件调试


前言

我们拿到一块单片机最小系统板,想要用它来作为平衡小车的功能控制,那么,我们必须弄清楚以下几点:
首先,这块板子的功能是否是完全正常,其上的外设是否满足我们的需求?
其次,在我们的知识范围内,我们所需要的模块功能能否正常调用出来?
最后,这些调用的功能模块能否协调工作,完成我们所需的所用任务指标?
接下来,我们逐一解决上述的各个问题:)
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灯

MiniSTM32_V3.3_SCH

我们可以把最小系统板想象成上面的这么一大块芯片,配合上用排针引出的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)

//PB0不需要重映射(PB0和TIM3_Channel3属于复用关系)
#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            //通道选择,1~4
#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;

  /*  clock enable */
  RCC_APB2PeriphClockCmd(BRE_TIM_GPIO_CLK, ENABLE); 
  BRE_TIM_GPIO_APBxClock_FUN( BRE_TIM_GPIO_CLK, ENABLE );
		
	BRE_GPIO_REMAP_FUN();  

  /* 配置PWM输出用到的引脚 */
  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 );
}

/**
  * @brief  配置TIM输出的PWM信号的模式,如周期、极性
  * @param  arr:自动重装值 psc:时钟预分频数
  * @retval 无
	* 注: 
	#STM32系统时钟频率和周期
	f_pclk = 72000000
	t_pclk = 1/f_pclk

	#定时器update事件周期
	t_timer = t_pclk*TIMER_TIM_Prescaler(psc+1)*TIMER_TIM_Period(arr+1)
 */
void TIMx_Mode_Config(u16 arr,u16 psc)
{  
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;																				
	
	
	/* 设置TIM3CLK 时钟 */
	BRE_TIM_APBxClock_FUN ( BRE_TIM_CLK, ENABLE ); 
	                                                                     	
	
	TIM_TimeBaseStructure.TIM_Period = arr; //当定时器从0计数到 TIM_Period+1 ,为一个定时周期
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分频系数:不分频(这里用不到)
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(BRE_TIMx, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

   /* PWM模式配置 */
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;	    				//配置为PWM模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	//使能输出
  TIM_OCInitStructure.TIM_Pulse = 0;				 						  			//设置初始PWM脉冲宽度为0	
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;  	  //当定时器计数值小于CCR1_Val时为低电平

  BRE_TIM_OCxInit ( BRE_TIMx, &TIM_OCInitStructure );	 									//使能通道
 
  BRE_TIM_OCxPreloadConfig ( BRE_TIMx, TIM_OCPreload_Enable );						//使能预装载	

  TIM_ARRPreloadConfig(BRE_TIMx, ENABLE);			 										//使能TIM重载寄存器ARR

  /* TIM3 enable counter */
  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

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:34:55  更:2021-08-10 13:36:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:47:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码