赞
踩
思路分析:
题目总的来说很基础,话不多说,直接看题!
使用大赛组委会提供的新版本嵌入式竞赛实训平台(基于STM32G431RBT6微控制器设计),完成本试题的程序设计与调试。程序编写、调试完成后,选手需通过考试系统提交以准考证号命名的hex文件。
hex文件是唯一成绩评测依据,不符合以上文件提交要求的作品将被评为零分或者被酌情扣分。
图1 系统硬件框图
3.1 基本功能
1)测量电位器R37输出的模拟电压信号VR37。
2)通过PA7引脚输出脉冲信号,通过串口控制脉冲信号占空比,输出频率可以通过按键调节。
3)通过按键实现界面的切换、电压参数和频率参数的调节。
4)通过LED和LCD完成数据显示和指示功能。
3.2 显示功能
1)数据界面包含三个显示要素:界面名称(DATA)、采集的实时电压数据(VR37)、脉冲信号频率(PA7)。
图2 数据界面图示
采集电压数据保留小数点后2位有效数字,单位为V。
频率数据单位为Hz。
2)参数界面包含两个显示要素:界面名称(PARA)、电压参数(VP1)。
图3 参数界面图示
电压参数保留小数点后1位有效数字,单位为V。
显示说明
(1)显示背景颜色(BackColor):黑色。
(2)显示字体颜色(TextColor):白色。
(3)请严格按照图示要求设计各个信息项的名称(区分字母大小写)和相对行列位置。
3.3 按键功能
1)B1:定义为“切换”按键,按下此按键,切换数据界面与参数界面。调整顺序如下图所示。
图4 B1“切换”顺序
2)B2:定义为“电压参数调整”按键,在参数界面下,每次按下此按键,电压参数增加0.3。调整顺序如下图所示。
注意:在数据界面下,按下按键B2无任何功能。
图4 B5“电压参数调整”顺序
3)B3:在数据界面下,定义为“频率调整”按键,每次按下此按键,频率增加1KHz。调整顺序如下图所示。
图5 B3“频率调整”顺序
备注:频率可调节范围1KHz - 10KHz。
注意:判断按键是否按下时,需进行消抖操作,避免单次按键操作,触发多次结果。
3.4 串口通信功能
使用入式新版本竞赛平台USART1完成串口通信功能。
通信波特率设置:9600 bps。
串口通信功能设计要求:
(1)串口收到字符‘1’,PA7引脚输出的脉冲信号占空比为10%;
(2)串口收到字符‘2’,PA7引脚输出的脉冲信号的占空比为20%;
(3)以此类推到串口收到字符‘9’,将PA7引脚输出的脉冲信号的占空比调节为90%;
(4)串口收到其他非法字符时(除字符‘1’到字符‘9’外的其他字符均为非法字符),返回固定字符串‘error’,串口未收到字符,不返回任何内容。
3.5 LED指示灯功能
1)数据界面时,指示灯LD1点亮,否则LD1熄灭。
2)参数界面时,指示灯LD2点亮,否则LD2熄灭。
3)当VR37>VP1时,指示灯LD3以0.1s秒为间隔切换亮灭状态,闪烁报警
4)LD3-LD8均处于熄灭状态。
3.6 初始状态说明
1)上电后处于数据显示界面。
2)上电时,频率为1kHz,占空比为10%。默认电压参数为0.3V。
备注:请严格按照此初始状态设计功能。
1.首先是AD采样的实现 看原理图如下,
去cubemx 里面配置,
把IN11选到Sing_ended,另一个配置同样即可。
LCD模块比赛的时候直接复制官方给的例程即可,如果要自己配置的话,对着原理图把对应的引脚设置为GPIO_Output即可,
关于led的在设置PD2为GPIO_Output即可,然后GPIO配置右边记得把led对应的引脚电平拉高。
key的话把对应的引脚设置为GPIO_input,在把电阻设置为上拉即可。以下配置都查看原理图得到更进一步得理解。
打开中断
定时器4用来当作按键消抖
思路看题目来做即可
void led_proc(void)
{ if(uwTick-led_tick<100) return;
led_tick=uwTick;
if(page==0) uled|=0x01;
else uled&=~(0x01);
if(page==1) uled|=0x02;
else uled&=~(0x02);
if(get_ADC(&hadc2)>VP1)
{
uled^=0x04;
}
else uled&=~(0x04);
led(uled);
}
void key_proc(void)
{
if(key[0].key_flag==1)
{
page=!page;
LCD_Clear(Black);
key[0].key_flag=0;
}
if(key[1].key_flag==1)
{
if(page==1)
{
VP1+=0.3;
if(VP1>3.3) VP1=0;
}
key[1].key_flag=0;
}
if(key[2].key_flag==1)
{
if(page==0)
{
pa7_hz+=1000;
if(pa7_hz>10000) pa7_hz=1000;
}
TIM3->ARR=1000000/pa7_hz-1;
// LCD_Clear(Black);
key[2].key_flag=0;
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(rx_buff[0]=='1') duty=10;
if(rx_buff[0]=='2') duty=20;
if(rx_buff[0]=='3') duty=30;
if(rx_buff[0]=='4') duty=40;
if(rx_buff[0]=='5') duty=50;
if(rx_buff[0]=='6') duty=60;
if(rx_buff[0]=='7') duty=70;
if(rx_buff[0]=='8') duty=80;
if(rx_buff[0]=='9') duty=90;
if(rx_buff[0]>'9'||rx_buff[0]<'1')
{
sprintf(tx_buff,"error\r\n");
HAL_UART_Transmit(&huart1,(uint8_t *)tx_buff,sizeof(tx_buff),50);
}
__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,duty);
HAL_UART_Receive_IT(&huart1,(uint8_t *)rx_buff,1);
}
void lcd_proc(void)
{
if(page==0)
{
sprintf(string," DATA ");
LCD_DisplayStringLine(Line2, (unsigned char *)string);
sprintf(string," VR37:%.2fV ",get_ADC(&hadc2));
LCD_DisplayStringLine(Line4, (unsigned char *)string);
sprintf(string," PA7:%dHZ ",pa7_hz);
LCD_DisplayStringLine(Line6, (unsigned char *)string);
sprintf(string," Duty:%d%% ",duty);
LCD_DisplayStringLine(Line8, (unsigned char *)string);
}
if(page==1)
{
sprintf(string," PARA ");
LCD_DisplayStringLine(Line4, (unsigned char *)string);
sprintf(string," VP1:%.1fV ",VP1);
LCD_DisplayStringLine(Line6, (unsigned char *)string);
sprintf(string," Duty:%d%% ",duty);
LCD_DisplayStringLine(Line8, (unsigned char *)string);
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM4)
{
key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
}
for(int i=0;i<4;i++)
{
switch(key[i].judge_sta)
{
case 0:
if(key[i].key_sta==0) key[i].judge_sta=1;
break;
case 1:
if(key[i].key_sta==0)
{
key[i].judge_sta=2;
key[i].key_flag=1;
}
else key[i].judge_sta=0;
break;
case 2:
if(key[i].key_sta==1) key[i].judge_sta=0;
break;
}
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。