STM32单片机初学心得
一个小阶段下来收获颇丰,经过复盘,整理相关笔记如下。(本早该发布一直拖到了现在)
1. 关于延时效果除了HAL_Delay外常用的方法
在这个阶段中做了一个小项目——楼道灯。
因为还未接触到继电器,所以这个小项目是以代码实现的,配置好相应硬件后开始编写代码,其中要实现一个让灯亮的中断条件,这个问题定义几个变量并判断大于或小于某个值、或是处于某个状态就可解决。
此外,要实现楼道灯亮一定时间后自动熄灭的效果,在此考虑的问题较多。在这里的代码实现里,我们在点灯的时候记录当前时间,然后循环获取当前时间看有没有超时,如果超时则控制关灯。
Part1.
实现这一功能作为初学者的自己开始想到的是直接调用HAL_Delay函数进行直接延时,后边在老师指导下才知道,HAL_Delay函数的确可以在这个项目中达到效果,但其实它是低效的,因为用HAL_Delay函数直接延时的话,程序就不能再做其它的控制,其他操作无法进行了。
Part2.
在判断时间是否到没有,我们不能直接用类似 if( (HAL_GetTick() - start) > 3000 )这样的条件判断( 3000是3000ms的意思 ),因为变量的最大记值是有限制的( uint32_t 最大计数到2^32-1 ),而时间是无限的,这样会存在时间回绕的问题。
【PS: 但在如果给出的问题类似 “ 在 xx ms内实现XX操作” 时就可用 if((HAL_GetTick() - start) > 3000 )这样的条件判断,这时这样的判断语句是最常用的。】
Part3.
这里我们参考Linux内核里的jiffies , 回绕解决方案,使用了time_after()这个宏来判断是否超时。这个宏我们需要添加到main.h头文件中。
楼道灯部分代码:
int main(void)
{uint32_t lux, noisy;uint32_t start = 0;uint8_t light_status = 0;while (1){if( OFF == light_status){adc_sample_lux_noisy(&lux, &noisy);printf("Lux[%lu] Noisy[%lu]\r\n", lux, noisy);if( lux<30 && noisy>800){turn_led(BlueLed, ON);//turn_relay(Relay2, ON); //继电器light_status = ON;/* record current time and will turn off in 3 seconds */start = HAL_GetTick();}}else{if( time_after(HAL_GetTick(), start+3000) ){turn_led(BlueLed, OFF);//turn_relay(Relay2, OFF); //继电器/* must give delay for turn relay off got noisy , it will affect next sample */HAL_Delay(200);/* set light status as OFF */light_status = OFF;}}HAL_Delay( 10 ); //在这里可以进行别的希望进行的操作}
}
2.杂
(1)切换1、0对应状态可相应左右移动,后再进行位运算调整。
(2)datasheet对应用到的需更深研究地进行学习效果更好。
(3)不知道的函数之类的不必死扣,百度关键字搜索。
(4)中断向量表里每一个中断服务处理程序都是4个字节,因为32位cpu字长是4个字节(.word),且要按4个字节来补齐,一个中断4个地址存放,中断号不存在或者无用不能删掉,要补0。
(5)函数返回值类型为_weak 说明该函数是可以被重写的,但_weak一定不能不写。
(6)只需1个位控制的只需低16个管脚,而2个位的需32个管脚。
(7)GPIOx_IDR知道管脚当前是高/低电平(先读这个寄存器再获取这个管脚位的值,获取位值:右移当前要看的管脚位,然后做相应取反,看最后输出是1是0),GPIOx_ODR设置一个管脚输出高/低电平(如果设置高电平就用1 或上 1的左移当前管脚序号;低的话就先重复设置高电平的操作,然后再),GPIOx_BSRR控制某一个管脚。(其他寄存器去看datasheet)
STM32单片机初学心得相关推荐
- STM32单片机初学6-SPI通信驱动IPS彩屏
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线. 和IIC一样,是单片机开发中最常用的通信方 ...
- STM32单片机初学8-SPI flash(W25Q128)数据读写
当使用单片机进行项目开发,涉及大量数据需要储存时(例如使用了屏幕作为显示设备,常常需要存储图片.动画等数据),单靠单片机内部的Flash往往是不够用的. 如STM32F103系列,内部Flash最多只 ...
- 初学stm32单片机可以做什么简单的小作品?
已从事单片机开发十几年,刚开始接触单片机时,感觉挺有意思. 可以用自己的思维写程序,控制硬件去实现一些智能化的操作. 刚点亮第一个LED,就开始幻想以后能做任何自己想要的产品,那感觉多爽! 但是你会发 ...
- stm32单片机实现多个闹钟_如何学习单片机:单片机都是相通的,一通百通
单片机是一种可编程的器件,现在所见到的电子产品中几乎都是以单片机为核心的,根据不同的功能需求,搭建不同的电路,从8位的单片机到32位的单片机,甚至比较高大上的ARM和DSP都可以看成是高级一点的单片机 ...
- 初学 STM32 (从 51 过度到 STM32 ,初学 STM32 必须了解的知识)
最近小编也是在学习 STM32F1 系列,因为前一段时间学过 51 ,所以这几天总结了一下从 51 过度到 STM32 经验与心得,现在与大家分享分享我的心得. 对于引脚的操作和 STM32 与 51 ...
- STC单片机和STM32单片机哪个更适合入门?
1.引言 在当今这个模拟电子技术看似被冷落(其实无处不在)和数字电子技术主导的信息时代,对于刚入电子信息相关专业的大中专学生或需要转型进入电子产品硬件研发行业的工程师而言,首先面对的第一个问题是:8位 ...
- 【嵌入式设计】【炒鸡详细】STM32单片机控制机器人程序设计框架解读(不定时更新)
因为疫情原因,我小机器人的底层单片机代码没人搞了,没人弄了就得我自己上.硕士时候有点儿基础,现在一边儿做一边儿学,争取用一天时间把机器人的底层STM32代码给搞出来. 雨哥最NB的地方就是学东西和做东 ...
- (转)jLink使用ITM机制实现调试stm32单片机
----------------------------------------------------------------------------------------------- 作者:p ...
- STM32单片机外部中断配置讲解
2019独角兽企业重金招聘Python工程师标准>>> 单片机外部中断简介 所谓外部中断,就是通过外部信号所引起的中断,如单片机引脚上的电平变化(高电平.低电平).边沿变化(上升沿. ...
最新文章
- 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第三十五集
- java sort算法名称_快速排序算法(Quick Sort)(java)
- 42、谈谈你对闭包的理解?
- gulp+babel实现es6压缩,并替换es6语法,压缩html,css
- 李洪强iOS开发之- 实现简单的弹窗
- linux 如何获得后缀_Bugku:杂项 linux
- 【英语学习】【WOTD】intoxicate 释义/词源/示例
- linux网卡不响应arp,Linux中的网络配置和故障排除命令,学会不会吃亏
- 龙族幻想服务器维护中怎么办,龙族幻想遇到无法连接服务器?两招教你轻松解决...
- no cortex-m sw device found_SW大模块水箱桂林厂家图纸
- MYSQL复习笔记12-视图
- 软件测试用例设计 (一)等价类划分法
- 通过tushare的股票数据绘制股票各曲线图——KDJ指标曲线
- 免费stm32视频教程分享:心率检测仪的设计与实现
- 【练习】获取新浪搜索中的热搜榜的标题
- html聊天室ui,震惊!这个H5居然是在线聊天室!(内附完整教程)
- POJ 1061	青蛙的约会
- 【数据科学】斯皮尔曼的等级相关系数(Spearman's coefficient)
- 【React Native】深入理解Native与RN通信原理
- SQL server数据库实验(三)数据库的嵌套查询和集合查询
热门文章
- 极光 短信验证出现403
- 使用 VirtualBox 虚拟机在电脑上运行 Android 4.0 系统,让电脑瞬间变安卓平板
- 【Java】算法积累1——大整数相加
- Python编程中的常见语句
- WINCC 常见问题
- Yii2 composer安装asset packagist 再提速 静态资源安装
- flask 8用户认证_Salted Password Hashing
- 打开或关闭windows功能时,提示“出现错误。并非所有的功能被成功更改” 已解决
- 小说名词解释:种田派
- myQNX account试用申请流程(license申请)