一、 遇到的问题
1.使用CubeMX时,路径一定不能加入中文,否则在生成代码时候显示报错。
2.编译时,出现多个Undefined symbol xxx (referred from mian.o)时,原因:在文件中缺少相应的.c文件。
解决:在相应文件中添加上对应.c文件
3.下载程序时,出现No ST-LINK detected
解决:点击小锤子按钮,选择Debug界面,在Use:选择为CMSIS-DAP Debugger
4.输入程序之后,如果按键无反应,需要复位才有反应
解决:在Debug 中点击Settings,选择Flash Download界面勾选 Reset and Run。点击OK。然后点击OK。
5.在.c中定义的函数,需要在对应.h中声明
6.在.c中定义的变量,如果在main.c中使用,需要在.h中extern一下
7.使用sprintf()函数时,需要#include "stdio.h",如果还有警告,点击小锤子,勾选Use MicroLIB.
8.所有的处理函数定义完都要在while(1)中使用,否则没有效果。
二 、LED
1.原理图
分析:PD2=1时,芯片将PC8~PC15引脚的信号传送到发光二极管的阴极。
这一组发光二极管是共阳极连接,在PC8~PC15电平为0时,LED亮,反之则灭。
2.CubeMX配置
1.将PC8~PC15引脚配置为GPIO_Output。Pull-down.如果不设置Pull-down,需要在初始化之前,将所有灯熄灭。
2.PD2设置为GPIO_Output。
3.相关函数
1.HAL_GPIO_WritePin(GPIOX,GPIO_PIN_x,GPIO_PIN_SET/RESET)
GPIOX:选择哪一组GPIO引脚,例如GPIOA,GPIOB...
GPIO_PIN_x:选择哪个引脚,例如GPIO_PIN_2
GPIO_PIN_SET/RESET:将该引脚置为1/0.
例如:HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
功能:将PD2置1.
4.LED处理函数和显示函数
1.显示函数LED_Disp(led_num)
led_num对应要处理的哪一个引脚,定义为8位,因为PC8~15是高8位,所以点亮的时候需要左移8位。
LED显示函数内容:先将PD2置1,将PC8~PC15引脚熄灭。然后再点亮。
void LED_Disp(u8 led)
{
//先讲PD2置1
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,0xff00,GPIO_PIN_SET);//熄灭
HAL_GPIO_WritePin(GPIOC,led<<8,GPIO_PIN_RESET);//点亮
//将PD2置0
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
2.处理函数LED_proc()
uwTick相当于是每ms加1,该函数相当于是每100ms灯闪烁一次,这个只是用来测试函数,测试完可以将注释部分删除。
u32 led_tick = 0;
u8 led_num = 0;
void LED_proc()
{
//每100ms闪烁一次
if(uwTick - led_tick < 100)
return;
led_tick = uwTick;
// if(led_num != 0)
// led_num = 0;
// else
// led_num = 0xff;
LED_Disp(led_num);
}
5.KEY
1.原理图
当对应按键按下时,该引脚被拉低;没有按键按下时,引脚被拉高。
PB0,PB1,PB2,PA0分别对应的是按键1,2,3,4。
2.CubeMX配置
PB0,PB1,PB2,PA0设置为GPIO_Input,Pull-up(更加稳定)
3.相关函数
1.HAL_GPIO_ReadPin(GPIOx,GPIO_PIN_x);
GPIOx:选择哪一组引脚
GPIO_PIN_x:选择哪一个引脚
例如:GPIO_ReadPin(GPIOB,GPIO_PIN_0);
读取某一PB0的引脚的电平高低。
4.按键读取函数和按键处理函数
1.按键读取函数Key_Read()
u8 key_value, key_down, key_up, key_old = 0;
void Key_Read()
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0)
key_value = 1;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0)
key_value = 2;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)
key_value = 3;
else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)
key_value = 4;
else
key_value = 0; //默认为0
key_down = key_value & (key_value ^ key_old);
key_up = ~key_value & (key_value ^ key_old);
key_old = key_value;
}
key_value 可以理解为是按键当前的状态;key_old可以理解为时前一个时刻的状态;
key_value ^ key_old判断当前状态是否和前一个时刻的状态一致。如果不一致则该部分等于1.说明有按键被按下。
key_value & (key_value ^ key_old)是如果有按键被按下,则是key_down。反之按键松开则是key_up。
2.按键处理函数
u32 key_tick = 0;
void KEY_proc()
{
if(uwTick - key_tick < 20)
return;
key_tick = uwTick;
Key_Read();
if(key_down == 1)
{
}
else if(key_down == 2)
{
}
else if(key_down == 3)
{
}
else if(key_down == 4)
{
}
}
先读取按键的状态,然后再根据哪个状态被按下,实现相应的功能。
三、LCD
官网给的有LCD函数,里面的CubeMX已经配置好。在上面的基础上修改即可。
1.原理图
2.相关函数
1.sprintf();
sprintf((char *)lcd_buf," 要显示的内容 ");
用于将格式化的字符写入到指定的缓冲区内。将要显示的内容以字符的形式写入到lcd_buf缓冲区中。
2.LCD_DisplayStringLine();
LCD_DisplayStringLine(Linex,lcd_buf);
将lcd_buf缓冲区的内容显示到屏幕的第x行。
3.LCD_Clear();
清除整个LCD屏幕,并将背景颜色设置为()内的颜色。
4.LCD_SetBackColor();
设置LCD的背景颜色
5.LCD_SetTextColor();
设置文本的颜色。
3.LCD处理函数
u8 lcd_buf[30];
u32 lcd_tick = 0;
void Lcd_proc()
{
if(uwTick - lcd_tick <100)
return;
lcd_tick = uwTick;
sprintf((char *)lcd_buf," DATA ");
LCD_DisplayStringLine(Line0,lcd_buf);
}
声明
上述内容是根据B站上up主电子爱好者老王讲解视频蓝桥杯嵌入式省赛国赛程序题手把手教程学习总结的。感兴趣的可以去看一下。讲的很好,可以快速上手。