当前位置: 首页 > news >正文

单片机基础

控制LED
按键控制
外部中断
串口发送
串口中断
使用DMA搬运数据
定时器
内部定时器更新中断
外部时钟定时器
从模式定时器
输入捕获
PWM输出
旋转编码器
控制舵机
ADC
ADC多通道采集
LED屏幕
通过手册写驱动库
BOOT

对于外设的驱动库,将其拖入到文件中后(.c,.h文件),一般只需要关注配置的引脚,然后在主函数直接调用函数即可。

1. 控制LED

在cubemx中选择led所在的引脚,配置为推挽输出,输出高低电平需要根据led的连接方式,确定刚开始是灭还是亮。在主函数中,writepin函数进行点亮。

2. 按键控制

在cubemx中设置,上拉输入,这里具体需要看按键原理图,然后直接在主函数判断,如果是低电平,也就是按下,如何处理。

3. 外部中断

在cubemx中选择外部中断引脚,可以选择上升沿,下降沿触发,配置好后,在it文件里面找到callback函数,在callback函数内部对接受进行处理。

4. 串口发送

简单的轮询,在cubemx中开启串口后,直接在主函数里面transmit,receive即可,注意这里只能接受定长数据,否则数据错乱。

5. 串口中断

在cubemx中打开中断,在函数中开启receive_it,这里是打开中断接受,为了防止只能接受一次,需要在回调函数再次开启,在回调函数处理即可。
这里说的是接受中断,发送中断直接写就可以?不用再调用回调函数

6. 使用DMA搬运数据

在cubemx中打开DMA通道,配置地址,内容自增(这里没搞明白),每次搬运的字节数(没有搞明白,每次先默认字节),然后生成代码后,其代码方法与中断一致。使用DMA还是有中断,只不过是将cpu搬运数据这一过程,交给dma处理了。还是cplcallback函数回调,这是dma的传输完成中断。如果想要接受不定长数据,需要借助别的中断,也就是串口空闲中断,这次只要接受数据寄存器上没有数据输入才会进入中断,与前者区分。exReceivetoidle,这里开启串口空闲函数,其对应的回调函数为uartex_rx_eventcallback回调函数。开启了DMA的不定长数据接受后,接受完输入的数据,会进入回调函数,此时通过hal_uart_transmit_dma()函数发送,这里有一个入参,可以确定不定长数据的长度。发送即可。(DMA有个数据接受过半中断,当数据量达到设置的最大值的一半以后,也会触发uartex_rx_eventcallback,关闭DMA传输过半中断函数:__HAL_DMA_DIAABLE_IT,第二个参数为DMA_IT_HT。
总的说,将IT函数改为DMA,即可实现DMA数据收发,将启动函数改为toidle,回调函数为eventcallback可以实现不定长数据收发。

对于寄存器来说,地址只有一字节的长度,所以地址也就不需要变化,内存需要挨个取数据,所以内存变化

7.定时器


这里使用定时器计使1s,使用定时器的时候,一定要开启定时器,也就是HAL_TIM_Base_START()

这里需要使用sprintf,组合后发送才不会乱码。
__HAL_TIM_GET_COUNTER
__HAL_TIM_SET_COUNTER
__HAL_TIM_GET_AUTORELOAD
__HAL_TIM_SET_AUTORELOAD
__HAL_TIM_SET_PRESCALER
所有设置的值都被存储在影子寄存器。

8.内部定时器更新中断

开启中断,使用periodelapsedcallback更新中断,在回调函数里面写逻辑即可。这里开启HAL_TIM_BASE_START_IT时候,也自动开启了基本功能。


选择更新中断;

9.外部时钟定时器

对来自GPIO上信号进行计数。

TI1_ED只能双边沿触发,TI_FP可以选择触发方式。

这里有单独的外部时钟模式2通道,可以在从模式控制器被占用时候,单独引入外部信号。
这里有个例子,使用外部时钟本质和内部时钟一样,也就是说,内部时钟,外部触发器,TI1,TI2地位等价。只不过需要外部信号作为时钟,代码完全一样。Filter的数值,是使用内部时钟作为判断。

这里的外部时钟模式1。TI1,TI2没太搞明白。
外部时钟模式1,通过触发器接入,选择外部时钟模式1后才可以选择TIP,TIED。

10.从模式定时器


除了外部定时器1,是与上面共用。还有reset mode,gated mode trigger mode。
外部时钟模式1:给定时器提供计数信号。
其他三种:控制定时器的工作状态。
复位模式:对定时器计数状态复位。


复位模式也就是在自动重装载的基础上,再来一个中断,可以一个定时器不干扰基本定时器的计数。比如检测到一个上升沿,打破计数,输出中断。并重新计数。此时会进入定时器更新中断。这也是另外三个模式的主要功能区别
门电路:当输入信号为高电平,才开始计数,否则不计数。

这里因为不进入中断,所以在循环中判断,当检测到高低电平,此时清零标志位。并发送从模式触发,此时停止计数。
触发模式:检测到边沿时,进行计数。只需检测到一个上升沿,不需要像门电路一样,一直处于高电平。触发模式仅能启动定时器,不能停止定时器。触发模式配合单脉冲模式,可以实现单脉冲定时器计数到自动重装载时,停止计数。也就是停止在0。
补充:

防止重启时进入更新中断一次。

11.输入捕获




得知PA10为TIM1的通道3,此时,设置其通道3为直接模式,通道4为间接模式。

此时有直接模式,通道3,间接模式,通道4。
配置完毕后,需要开启定时器以及输入捕获。输入捕获为ic_start()

显示捕获定时器1的通道3。
使用中断,对应的中断回调函数为ic_capturecallback。
读取具体的捕获值的函数为:

总的来说,选择一个有输入捕获功能的引脚。一个使用直接捕获,获得上升沿数据,一个作为间接捕获,获得下降沿数据。

12.PWM输出

输入捕获/输出比较寄存器
输出比较模式:PWM模式1,PWM模式2

使用PWM生成模式,输出PWM波


设置的为pwm中高电平的时间,改变high low,设置高低电平时间。
开启PWM通道:HAL_TIM_PWM_STATR(htim,CHANNEL)
这里常用的函数有:

13.旋转编码器(Encoder)


将A,B相信号,设置A为上升沿触发中断,读此时B相的高低电平。通过定时器来计时。

这里可以直接将旋钮接入外部时钟模式2,来进行计数。
对于转速快的。使用编码器接口:


编码器接口对上下边沿均敏感。在上下边沿均会加1。

具体的连接方式为:

因为计数编码器的脉冲,所以不用设置时钟源,直接选择组合通道设置。

选择计数时刻:

POLARITY:设置有效电平为高电平还是低电平。
IC:这里是直接捕获,也就是TI1FP1,TI2FP2。
然后这里说一下按键:

按键这里按下接低电平,松开没有外部上拉,这里内部上拉保持按下时候为低电平,不按下为高电平。
编码器模式:

14.控制舵机

首先判断其pwm工作范围,然后选择引脚的PWM生成模式,这里cubemx设置是设置了使用内部时钟,然后在此基础上选择占空比。以此生成pwm波.
注意,这里使用pwm生成,一定要开启pwm生成,也就是__HAL_TIM_PWM_STATR()函数。

TB6612模块


输入IN1,IN2,PWM波,控制输出OUT1,OUT2。

衰减指的是电流,与后面刹车,滑行对应。
按照表格写代码:

也就是一个低电平,一个输入pwm波。
这个过程是,选择一个引脚推挽输出低电平,另一引脚通过pwm输出高电平。控制速度。

15.ADC

模拟数字转化:逐次逼近法,二分比较确定电压值。

实际操作过程。

  1. 启动ADC,2.采样转化,3.获取计算。
    对于stm32f103,有16个通道可以进行采样,称其为16个外部通道。
    两个内部通道,一个是内部温度传感器,一个是内部参考电压。

    规则组像是一个排队的表格,当将通道注册,ADC会对此通道进行采样转化。也可以一次注册多个通道,让ADC进行采样转化。
    实战:测量电压值。

    第一要点是:ADC时钟不要太快,不要超过14mhz。否则会有警告。
    这里使用的函数有:


    等待转换完成的函数:

    校准函数:

    注意:校准函数要在while循环外
    示例:

    这里是单次转化,所以adc_start()在循环内部。可以使用连续转化,此时只需要在while循环外部开启一次转换即可。

    此时代码变为:

16. ADC多通道采集:

此时多通道需要开启扫描模式。此时多配合DMA搬运数据使用。此时DMA也可以设置为循环模式。
采样周期按照外设要求选择。

接着是DMA配置:
首先是外设到内存,内存地址自增,这里是因为相比之下,接受外部数据,此时单片机为内存。内存地址自增防止数据覆盖。


这里因为ADC的分辨率是12位,所以选择16位,halfword。

这里要注意接受数组的位数要匹配,halfword是uint16_t,word是uint32_t。
在代码中每一个是12位数,所以用四个uint16类型即可表示。最后参数是数组的长度
注意区分。

这里需要注意,如果不选择持续转换与DMA循环,此时,需要在循环里面开启ADC_DMA,然后在回调函数里面处理:

如果选择了持续转换与DMA循环,此时随时可以取数据了,在循环外开启。并直接在while循环里面处理即可。
ADC:在设置采样频率时,必须满足设置的采样频率大于待采样的2倍。奈奎斯特定理。

DMA规则组可以同时转化16个通道,但是只有一个数据寄存器。只会保留最后的一个,所以配合DMA使用注入组有四个通道,不用担心数据被覆盖。开始触发有规则组,注入组。双ADC模式。
DMA规则组可以同时转化16个通道,但是只有一个数据寄存器。只会保留最后的一个,所以配合DMA使用注入组有四个通道,不用担心数据被覆盖。开始触发有规则组,注入组。双ADC模式。
单次转换,非扫描模式:转换完成eoc置一,此时读取。下次转换时候再开启
连续转换,非扫描模式:不需要判断标志物,想要读的时候直接读取。
单次转换,扫描模式:需要自己设置通道数,全部转换完成,eoc置一,手动产生下一次,开始新转化。
连续转换,扫描模式:
左右对齐:左移一次,相当于数乘2,如果不需要高分辨率,此时取高八位。一般选择右对齐就可以。
采样时间:如果外部电源一直变化,此时不准确,所以使用一个电容,采集电压,进行判断。闭合采样开关然后断开。采样时间越大,越能避免毛刺干扰。
转换时间:采样时间+12位adc转换周期。
校准:执行一次校准。








17.LED屏幕


Set_pixel():


驱动库使用:

使用方法:

使用一般其他的驱动库:
引用的方法一样。


其中汉字的字模:

17.通过手册写驱动库

1.找到厂家给的引脚配置说明图。


2. 通信协议,芯片驱动
使用现有驱动文件:
拖入.c,.h文件->在keil中加入.c文件,如下操作引入.h文件路径。



将头文件加入公共头文件,此时可以在其他主函数中引用公共头文件,调用其中的函数。

输出模式的下拉是:保持引脚在未被驱动的时候默认保持低电平。

新建自己的文件夹:


18.BOOT

http://www.cnnetsun.cn/news/850455.html

相关文章:

  • 【游戏推荐】展翅翱翔 全DLC(WINGSPAN)免安装中文版
  • HTTPS克隆Git仓库时总要输密码,怎么一劳永逸地解决?
  • 我爱学习,我的思想特别的正
  • 基于Springboot+Vue的企业数据资产登记系统源码文档部署文档代码讲解等
  • Figma AI Bridge MCP
  • 【Python踩坑全记录】-pip install xxx 命令安装的 ,在电脑的哪个盘?
  • maven中的os-maven-plugin插件的使用
  • 一天一个开源项目(第5篇):Moltbot - 扒一扒爆火的AI桌面助手,是贾维斯平替还是过度炒作?
  • 肝了整整90天!我把RK3588 Android开发做成了完整教程
  • Thinkphp和Laravel基于Web的铁路火车票订票管理系统_w8iq4_
  • Thinkphp和Laravel私人服装西服衣服定制系统_0le12_
  • 实力加冕!搭贝闯过飞书多轮严审成功入驻,零代码硬实力获平台官方认证
  • 《创业之路》-867-组织的自动化、数字化、信息化、智能化、自主化的五大系统详解
  • 华为OD技术面真题 - 数据库Redis - 1
  • 乐迪信息:船舶AI偏航检测算法:实时告警,保障航线规范
  • 从“测试执行者”到“TestOps架构师”:我的职业跃迁
  • 【linux内核】一级页 二级页
  • 2026年Agent效率优化技术全景总结:从记忆、工具到规划的三大核心组件,建议收藏!
  • 大数据领域Hive的多级分桶技术解析
  • Reddit营销:如何在Reddit写出“像用户一样”的营销贴?
  • Thinkphp和Laravel+vue美特超市进销存管理系统_91crh
  • 论文AI率从90%降到10%,我只用了嘎嘎降这一招
  • 实测5款软著材料生成器:哪个能让申请一次过?
  • Thinkphp和Laravel儿童性教育新闻文章论坛网站_
  • 【游戏推荐】未见之界 (The Axis Unseen)免安装中文版
  • 零基础Git版本 安装教程
  • 10个技巧:提升生成式AI的鲁棒性测试
  • 基于Thinkphp和Laravel语言的考试信息报名系统_5n9zn
  • 基于Thinkphp和Laravel的旅游出行指南_655ms
  • USB协议原理梳理