找回密码
 立即注册
首页 业界区 安全 蓝桥杯STM32G431RBT6

蓝桥杯STM32G431RBT6

诸婉丽 4 天前
蓝桥杯

注意事项


  • 移植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);用来开启

  1. //串口接收函数,没有写道串口中断函数内部,注意
  2. if(接收到的数据>0)
  3. {
  4.     if(接收到的数据==正常长度)
  5.     {
  6.         if(接收到的数据==正常值)
  7.         {
  8.             操作;
  9.         }
  10.         else
  11.         {
  12.             异常标记;
  13.         }
  14.     }
  15.     else
  16.     {
  17.        异常标记;
  18.     }
  19.     数据数组清零;
  20.     标记长度清零;
  21. }
复制代码


  1. //主函数串口接收处理
  2. if(接收长度!=0)
  3. {
  4.     int 临时长度=接收长度;
  5.     延时1ms;
  6.     if(临时长度==接收长度)
  7.     {
  8.         串口接收处理函数;
  9.     }
  10. }
复制代码

  • 发送数据函数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);使用中断模式
  1. //main.h补全头文件
  2. #include "stdbool.h"
  3. #include "string.h"
  4. #include "stdio.h"
  5. #include "stdlib.h"
  6. //cubemx生成代码要注意把部分头文件从main.c复制到main.h
复制代码
产品手册

1.png

2.png

3.png

4.png

5.png

6.png

7.png

8.png

9.png

10.png

初始配置

11.png

12.png

13.png

14.png

15.png

然后创建工程代码
LED

16.png

17.png

[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
您需要登录后才可以回帖 登录 | 立即注册