作为一个电子学院学生,大二暑假才开始自学单片机知识(还是因为报名了电赛而不得不去学),深感愧疚。从今年7月至8.4的将近四周时间内哩哩啦啦学了一些基础模块(其中光是练习点灯和其他基础知识就花了一周多的时间),自己觉得进步尚可。不过这尚可的进步和微不足道的单片机知识在电赛延期三个月里也忘得差不多了。前两周开始着手复习,不过已经对写代码产生了一些畏惧感,而且不知该从何入手。

后天就开始比赛,而我还在这摸鱼写帖子(就当是写帖子巩固下以前写出来的代码吧!(理不直气也壮

ps:板子是STM32F407V

一、关于点LED的各种操作

1.直接通过cubemx设置对应gpio引脚后,在while(1)循环里调用hal库的电平翻转函数和延时函数。

#define LED_Pin GPIO_PIN_13
#define LED_GPIO_Port GPIOCwhile (1){HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);HAL_Delay(500);}

这里我的LED对应引脚是PC13,且低电平时LED才会被点亮。

2.通过设置定时器,利用定时器中断1s翻转一次LED电平,达到LED闪烁的效果。

工程中配置TIM4定时器选择内部时钟不分频作为时钟源,挂载到APB1时钟总线上(假设总线频率设置为50MHz),设置为递增计数模式,预分频器设置为5000-1,即5000分频,最后定时器的频率为10000HZ,一个脉冲的时间为1/10000s。

若要定时1s,则自动重载寄存器设置为10000-1(如要定时0.2s,则自动重装寄存器设置为0.2/(1/10000)-1.即2000-1)。
在main()函数中调用HAL_TIM_Base_Start_IT(&htim3)开启定时器,定时器从0开始计数,当计数到10000-1,即9999时,产出上溢出事件,计数器又从0开始继续计数。由于我们开启了定时器中断,所以发生上溢出事件时会触发定时器中断。程序会转跳到中断服务函数中运行。我们在中断回调函数中翻转LED的电平。下次定时器再次溢出触发中断继续翻转LED的电平。所以我们会看到LED不断闪烁。

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM4_Init();/* USER CODE BEGIN 2 */HAL_TIM_Base_Start_IT(&htim4);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==htim4.Instance)HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
}
/* USER CODE END 4 */

3.设置按键的外部中断触发事件,通过按键控制LED亮灭(按一下就亮再按一下就灭)

在cubemx中设置按键对应的引脚(我的板子对应的是PA15,按下按键时PA15为低电平)为GPIO_EXTI15模式的下降沿外部中断触发模式,这样按下一次按键,引脚有高电平变为低电平,触发中断。

在中断回调函数中先确认是PA15引发的中断,然后在函数中写下翻转LED电平的语句即可。

#define KEY_Pin GPIO_PIN_15
#define KEY_GPIO_Port GPIOA
#define KEY_EXTI_IRQn EXTI15_10_IRQn/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin == KEY_Pin)HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
}
/* USER CODE END 4 */

11.3更新

4.按键直接控制LED亮灭(非中断方式)

在cubemx中设置按键对应的引脚(PA15)为GPIO_Input模式,上拉电平(按下按键时PA15为低电平)。在while(1)循环中检测PA15是否为低电平(这里需要加一个延时去抖的语句),然后在条件判断语句里写翻转LED电平的语句。

while (1){if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_RESET){HAL_Delay(10);if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_RESET)HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);}}

但是事实证明这个方法不如方法3好用,LED并不能很听话地一按就亮再按就灭......

二、关于折腾USART的各种操作

个人推荐友善串口助手(在网上能搜到破解版)

1.普普通通的串口收发显示

(1)用HAL库自带的函数HAL_UART_Transmit,HAL_UART_Receive;

//将字符串“hello”发送到串口USART1,使用电脑串口助手即可看见发送的字符串
HAL_UART_Transmit(&huart1, (uint8_t*)"hello", sizeof("hello"), 100);//用电脑串口助手向串口发送数据,同时将数据保存到temp变量中
HAL_UART_Receive(&huart1, (uint8_t*)temp, sizeof(temp), 100);

(2)include "stdio.h",使用里面的printf函数。在此之前需要先进行重定向操作(我的个人理解是,printf默认将显示内容发送到电脑端,但此时我们需要它将内容发送到对应的串口端,例如USART1。因此需要“重新定义发送方向”,即重定向)

#include "stdio.h"int fputc(int ch,FILE * f)
//重定向C库函数printf到串口USART1,重定向后可使用printf函数
{uint8_t temp[1]={ch};HAL_UART_Transmit(&huart1,temp,1,1000); //haurt1根据需要的配置修改return ch;
}int fgetc(FILE * f)
//重定向C库函数scanf到串口USART1,重定向后可使用scanf、getchar函数
{int ch;HAL_UART_Receive(&huart1,(uint8_t *)&ch,1,1000);  //haurt1根据需要的配置修改return ch;
}//好像也可以写成uint8_t ch;HAL_UART_Transmit(&huart1,&ch,1,1000)
//或者直接写成HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,1000)

2.串口回显操作

啊!光是这个回显就花了我好长时间去琢磨,我爆哭,现在也没弄得很明白。最后是通过检测串口接收标志是否置位(即接收完毕),来接收一个定长字符串,保存至定长数组,然后再发送至串口(傻子做法,欢迎各位大佬指点)

uint8_t str[20];while (1){if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) != RESET){HAL_UART_Receive(&huart1,str,sizeof(str),100);    //调用HAL库函数获取输入的内容HAL_UART_Transmit(&huart1,str,sizeof(str),100);   //调用HAL库函数输出输入的内容}
}

3.串口接收——中断方式版

我这里实现的功能是接受一个数字,加2后返回。

但是事实又证明并不是很好用,接收的数字是ASCII码版的数字,也就是说,当我发送“9(39H)”时会给我返回“;(3BH)” 。而且当我发送“12”时,给我返回的是“34”emmmm= =

 while (1){HAL_UART_Receive_IT(&huart1, &k, 1);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量}/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance==USART1)//判断是否为对应串口{//在这里写入自己要实现的代码k=k+2;HAL_UART_Transmit(huart, &k, 1, 100);}
}
/* USER CODE END 4 */

今天先更到这,我去找找回显不定长字符串的代码了~

2021电赛备赛心路历程(含代码例程)相关推荐

  1. 蓝桥杯青少C++省赛备赛指南和真题详解

    蓝桥杯大赛是工业和信息化部人才交流中心举办的全国性专业信息技术赛事,已经成功举办了13届,历时14年.蓝桥杯大赛首席专家倪光南院士说:"蓝桥杯以考促学,塑造了领跑全国的人才培养选拔模式,并获 ...

  2. 92天倒计时,蓝桥杯省赛备赛攻略来啦~

    就在前几天,蓝桥杯大赛组委会公布了第十三届蓝桥杯个人赛省赛时间,将于 2022 年 4 月 9 日正式开赛! 第十三届蓝桥杯的赛事大致安排,也可以看看以下时间轴: (PS:马上放寒假了,要努力备赛!机 ...

  3. 2023年美赛备赛指南

    随着科技的发展和全球经济的快速增长,数学在现代社会中扮演着越来越重要的角色.而美国大学生数学建模竞赛(MCM/ICM)则被认为是全球最具影响力和最具挑战性的数学竞赛之一.参加美赛已成为许多数学.计算机 ...

  4. 华为ICT大赛实践赛备赛经验总结

    华为ICT大赛备赛经验总结 1.比赛形式 去年的省赛是个人赛形式 只有笔试 满分1000分 题目类型为 判断正误 单选 多选 省赛是考试的形式 最后取全校前三作为学校的代表队 然后和其他学校的代表队进 ...

  5. 2022数学建模国赛备赛阶段性记录(1-1)

    数学建模国赛培训记录,主要使用软件为MATLAB,主要内容为在数学建模竞赛中常用的操作.数学与模型以及部分练习题的解析. 一.常规操作 1.基本运算 MATLAB内四则运算相当于计算机的加减乘除,对应 ...

  6. 2021美赛备赛【01】MCM / ICM

    首先给出 -- 美赛官网 MCM/ICM = "数学建模竞赛"和"交叉学科建模竞赛" [本文转载 仅供学习] 〇.比赛时间(周末1)和 官网说明摘要 ★ 时间: ...

  7. 【2023电赛备赛】使用sysconfig对ccs进行图形化编程

    写在前~本章将会详细的讲解sysconfig图形化编辑软件的使用方法.如有不妥的地方欢迎各位大佬斧正!!! 目录 软件介绍 特点 需要准备内容: 操作步骤: 软件介绍 官网介绍称: 为了帮助简化配置挑 ...

  8. 【第五届集创赛备赛】一、黄乐天老师赛事宣讲及各个赛题分析

    赛题地址:第五届集创赛--紫光同创杯 0.工作安排 工作安排(2021年3月7日): 1.完成报名选题相关事宜,初步定为紫光同创杯.(3月10号之前确定选题并报名) 2.完成紫光同创开发环境的搭建(P ...

  9. 【第五届集创赛备赛】九、SD卡控制器开发总结

    文章目录 一.SDIO+DMA方案 1.1.目标与初衷 1.2.过程与成果 1.2.1.平台测试 二.SPI+FIFO方案 2.1.目标和初衷 2.2.过程与成果 2.2.1.测试平台 参考 一.SD ...

最新文章

  1. R语言使用pwr包的pwr.t.test函数对分组样本数相同的t检验进行效用分析(power analysis)、在已知效应量(effect size)、显著性水平、样本量的情况下计算假设检验的效用值
  2. Redis命令——Keys相关
  3. fillna函数_听说这些pandas函数,是数据科学家和软件工程师的最爱
  4. python设计小游戏谁先走到17_蜗牛绕墙爬(python小游戏源码)
  5. CALL TRANSACTION 和 SUBMIT 事务码之间的跳转
  6. python玩王者荣耀皮肤碎片怎么获得_教你用Python代码免费获取王者荣耀全英雄皮肤...
  7. Fiddler中文版 软件分享(亲测可用!)
  8. 最新影视小程序源码去授权版免费下载
  9. 分享一份软件测试面试指南
  10. 风吹雨PHP多应用授权系统【开源】
  11. opengl学习笔记
  12. Pull Request 到底是什么意思
  13. 后台nodejs存储图片以及前端显示
  14. 无悔入华夏怎么一直显示服务器,无悔入华夏怎么统一_无悔入华夏统一方式技巧攻略_玩游戏网...
  15. 路由器固件编译及个性化
  16. 微信多开防撤回工具再也不用担心好友撤回消息和登录多个账号了
  17. js逻辑训练题_几道javascript练习题
  18. 微星电脑不能u盘引导linux,华硕笔记本u盘重装微星怎么启动不了系统系统系
  19. 3D MAX石墨工具学习技巧
  20. 2020最新支持WorldFirst收款的跨境电商平台及支付网关!

热门文章

  1. 2023.02.14草图大师 卧室房间 效果图
  2. UE 5.1正式发布,有哪些值得一试的新功能?
  3. 代码随想录——求根节点到叶节点数字之和
  4. 互联网电影院带来新突破,5G+4K’
  5. 淘宝商品详情接口,淘宝详情页接口,宝贝详情页接口,商品属性接口,商品信息查询,商品详细信息接口,h5详情,淘宝APP详情
  6. Shell中declare -A的用法?
  7. C#登录拍拍,总是提示输入有误
  8. win10安装quicktime
  9. LiveData vs EventBus?是否可以实现共赢
  10. 中国大学慕课MOOC ,Shell测试答案