蓝桥杯嵌入式——第四届省赛题-双路输出控制器

蓝桥杯嵌入式——第四届省赛-双路输出控制器

一、赛题分析

这一届赛题用到的模块的系统框图如下图所示,系统硬件电路主要由 MCU 控制单元、独立按键、 LCD 显示单元、 串口通讯单元、 EEPROM 数据存储单元和 LED 指示单元组成,其实除此之外还用到了TIM定时器、PWM输出、RTC实时时钟等单元。
其中大部分模块都是比较常规的,如LCD、LED、按键、EEPROM等模块没有什么需要注意的,把驱动写好了直接用就是了。
需要我们稍微注意一下的就是RTC时钟的边界条件, 另外一个非常容易出问题的是TIM2的通道CH3和TIM4的通道CH3的输出引脚是PA2和PA3,刚好PA2和PA3又是用于USART2的功能引脚,他们会发生冲突,所以这两个模块不能同时使用,使用其中一个的时候,需要将另外一个一个先关闭。
在代码的逻辑部分还是和上一届的差不多,比第三届的稍微复杂一点点吧,但是只要各个模块的驱动写的没有什么问题,逻辑方面自然没有问题了。
在这里插入图片描述

二、问题总结

  1. 关闭外外设的时候,一定要后关闭外设的时钟。使能一个外设的时候,要先使能外设的时钟,在打开对应的外设。如下代码所示,关闭TIM2,打开USART2。
// 一定要先关定时器,再关闭时钟
/* TIM2 diable counter */
TIM_Cmd(TIM2, DISABLE);
/* TIM2 clock diable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, DISABLE);
/* Enable USART2 Clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
/* Enable the USART2 */
USART_Cmd(USART2, ENABLE);
  1. PWM的OCTOGGLE模式输出占空比为0%和占空比为100%的方法?
    如果我们直接将占空比设置为100%或者0%是会出问题的, 所以在要输出100或者0%的时候,直接将对应的IO口重新配置为推挽输出,然后再输出高电平或者低电平。当我们要正常输出PWM的时候,将对应的IO口的功能又重新配置为推挽复用输出就OK了。
void PAx_Output(uint16_t GPIO_Pin_x,FunctionalState NewState)	// 将引脚配置为推挽输出,只能输出高低电平
{
    
    
	GPIO_InitTypeDef GPIO_InitStructure;

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	if(NewState == ENABLE)
		GPIO_SetBits(GPIOA,GPIO_Pin_x);
	else
		GPIO_ResetBits(GPIOA,GPIO_Pin_x);
}

void PAx_Output_PWM(uint16_t GPIO_Pin_x)	// 将引脚配置为模拟输出,允许输出PWM信号
{
    
    
	GPIO_InitTypeDef GPIO_InitStructure;

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}
  1. 使能C语言的三目运算符要特别注意
    最好在表达式前后加上括号,否则可能会报错。举例如下:
RX_COMMEND.x==1?(ch2_enable=0):(ch3_enable=0);
  1. 如果只想关闭PWM输出的某一个通道怎么办?
    查看数据手册,在定时器的捕获/比较使能寄存器(TIMx_CCER)中的CCxE这一位可以关闭或者开启输出,具体代码如下
// 使能输出
TIM2->CCER |= 0x0010 << ((x - 1) * 4);	// x表示第几个通道
// 禁止输出
TIM2->CCER &= ~(0x0010 << ((x - 1) * 4));	// x表示第几个通道

在这里插入图片描述

三、代码

码云
GitHub

猜你喜欢

转载自blog.csdn.net/qq_43715171/article/details/113662361