蓝桥杯
注意事项
- 移植lcd之后要记得在main函数内LCD_Init();开启lcd。
- 如果lcd显示时led全亮大概率是PD2锁存器出问题
- lcd显示最好都各自带一个char text[30];
- 按键按下表启动,进入下一步
- adc一定要在main开启校准函数HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);记住Calibration和ADC_SINGLE_ENDED
- adc自写函数里每一次最好都开启一遍HAL_ADC_Start(hadc);
- adc自写函数里value=HAL_ADC_GetValue(hadc);用uint32_t存储,之后转换到float数
- adc的转换先乘以3.3再除以4096,顺序反了就归零了
- 串口发送简单,接收需要中断函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
- 把串口接收单数据和数据数组分开写,用于接收的单数据是uint8_t类型,不是char类型
- 接收的数据数组是char类型
- 单数据接收函数HAL_UART_Receive_IT(&huart1,&data,1);最后接收的长度是1,而且中间的单数据必须取地址,这里接收函数最好用中断模式
- 要先在主函数写一个HAL_UART_Receive_IT(&huart1,&data,1);用来开启
- //串口接收函数,没有写道串口中断函数内部,注意
- if(接收到的数据>0)
- {
- if(接收到的数据==正常长度)
- {
- if(接收到的数据==正常值)
- {
- 操作;
- }
- else
- {
- 异常标记;
- }
- }
- else
- {
- 异常标记;
- }
- 数据数组清零;
- 标记长度清零;
- }
复制代码- //主函数串口接收处理
- if(接收长度!=0)
- {
- int 临时长度=接收长度;
- 延时1ms;
- if(临时长度==接收长度)
- {
- 串口接收处理函数;
- }
- }
复制代码
- 发送数据函数HAL_UART_Transmit(&huart1,(uint8_t *)text1,strlen(text1),50);中间的char类型text要强制转换(uint8 *),发送函数最好别用中断模式,第三个长度用strlen,最后一个数记为50
- memset函数用法memset(datas,0,30);最后一个直接写数字就好
- 主函数需要开启pwm定时器HAL_TIM_PWM_Start(&htim17,TIM_CHANEL_1);
- 改变占空比函数__HAL_TIM_SET_COMPARE
- 基础定时器(定时中断功能):开启示例HAL_TIM_Base_Start_IT(&htim3);使用中断模式
- //main.h补全头文件
- #include "stdbool.h"
- #include "string.h"
- #include "stdio.h"
- #include "stdlib.h"
- //cubemx生成代码要注意把部分头文件从main.c复制到main.h
复制代码 产品手册
初始配置
然后创建工程代码
LED
[code]//led.c#include "led.h"void LED_Disp(uchar t){ HAL_GPIO_WritePin(GPIOC,GPIO_PIN_ALL,GPIO_PIN_SET);//先把所有的都关上 HAL_GPIO_WritePin(GPIOC,t按键检测2{是否仍然按下}按键检测2 -->|仍然按下_消抖成功|状态2按键检测2 -->|松开了_消抖掉|状态0状态2 -->按键检测3{是否仍然按下2}按键检测3 -->|一直按下_计时time++|状态2_1按键检测3 -->|松开了_要判断time长短|状态2_2状态2_1 -->时间判断{是否够长}时间判断 -->|超过LONG_TIME_此时longflag挂起|状态0时间判断 -->|没超过LONG_TIME_继续计时|状态2状态2_2 -->时间判断2{是否够长2}时间判断2 -->|没超过LONG_TIME_此时shortflag挂起|状态0后面修改了下逻辑,松开后再判断长短,上面的代码没改哦
graph TD状态0 -->按键检测{是否按下}按键检测 -->|按下|状态1按键检测 -->|没有按下|状态0状态1 -->按键检测2{是否仍然按下}按键检测2 -->|仍然按下_消抖成功|状态2按键检测2 -->|松开了_消抖掉|状态0状态2 -->按键检测3{是否仍然按下2}按键检测3 -->|一直按下_计时|time++按键检测3 -->|松开了_|判断time长短判断time长短 -->时间判断2{是否够长}时间判断2 -->|没超过LONG_TIME_此时shortflag挂起|状态0时间判断2 -->|超过LONG_TIME_此时longflag挂起|状态0按键第二种写法(滴答定时器)
[code]#define KB1 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)#define KB2 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)#define KB3 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)#define KB4 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)#define KBGET KB1 | (KB2 |