思路分析:
题目总的来说很基础,话不多说,直接看题!
一、基本要求
使用大赛组委会提供的新版本嵌入式竞赛实训平台(基于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;
}
}
}
发表评论