发新帖本帖赏金 30.00元(功能说明)我要提问
返回列表
打印
[KungFu8位 MCU]

8位机普通外设开发总结,看看这些功能你会怎么用?

[复制链接]
5014|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 uuguoleilei 于 2024-9-20 18:59 编辑

#申请开发板# #技术资源# #每日话题# #有奖活动# #申请原创#@21ic小跑堂

我使用的是20引脚的mcu,拿到的芯片的第一步是查看芯片手册和它有哪些资源;


**一、时钟配置与定时器设置**当拿到一款 20 引脚的 MCU 时,首先应查看芯片手册以充分了解其资源。此款 MCU 的最大频率为 16M,在特定应用场景下可能足以满足需求。以下是时钟和定时器的配置步骤:1. 配置晶振引脚:   - 将`TR04`设置为 1,表明开启该引脚的特定功能。   - `ANS04`设置为 0,禁用模拟功能选择。   - `PUR04`设置为 0,不启用上拉电阻。   - `IOCL04`设置为 0,进行特定的输入输出配置。   - 对引脚`TR05`、`ANS05`、`PUR05`、`IOCL05`也进行类似设置,以激活晶振引脚,为芯片提供稳定的时钟源。
最大频率只有16M,那也够用了豁
那我们就先把时钟配置一下,简单定时一下可以让芯片运行时间片吧
代码如下;
先配置晶振的两个引脚,让它激活一下晶振先;

      TR04 = 1;
      ANS04 = 0;
      PUR04 = 0;
      IOCL04 = 0;

      TR05 = 1;
      ANS05 = 0;
      PUR05 = 0;
      IOCL05 = 0;





2. 配置频率:   - 通过设置`OSCCTL`寄存器为 0x075,调整芯片的时钟频率,使其适应不同的应用需求。3. 配置定时器:   - 设置`T3CTL`为 0x80,初始化定时器 3 的特定控制参数。   - `T4REH`设置为 0x07,`T4REL`设置为 0XD0,确定定时器 4 的重载值,以控制定时器的时间周期。   - 将`T3IF`初始化为 0,清除定时器 3 的中断标志位。   - 启用`T4IE`、`PUIE`和`AIE`中断使能,以便在特定事件发生时触发中断处理程序。4. 中断获取时间标志:   - 定义中断函数`int_fun0() __interrupt(0)`,用于处理中断事件。   - 在中断函数中,当检测到定时器 4 中断标志位`T4IF`为 1 时,进行相应处理。   - 首先将`T4IF`清零,以清除中断标志位。   - 然后设置`flag1ms`为`TRUE`,表示 1ms 时间标志已被设置,可用于后续的时间相关操作。在这个过程中,需要注意对各种配置参数的选择要有明确的依据,并考虑可能出现的错误情况,如晶振无法正常起振或定时器配置错误等。应添加适当的错误处理机制,以便在出现问题时能够及时发现并采取相应的措施。
再配置一下频率

OSCCTL =  0x075;  



再配置一下定时器;
T3CTL = 0x80;

T4REH = 0x07;

T4REL = 0XD0;

//使能中断
T3IF = 0;
T4IE = 1;
PUIE = 1;
AIE = 1;




在中断获取1ms时间标志;
// Interrupt Function High Enter
void int_fun0() __interrupt(0)
{

   
    if (T4IF)
    {
        T4IF = 0;
        flag1ms = TRUE;
      
    }

}






---------------2024年0807-------完成了定时器3的配置-----------------

**二、串口配置与数据发送**当 MCU 需要进行通信时,串口通信是一种常用的方式。以下是串口配置步骤:1. 串口初始化:   - 设置`RSCTL1`为 0x00000090,配置串口模块的相关参数,如数据位数、停止位等。   - `TSCTL1`设置为 0x00000022,调整串口发送状态的控制参数。   - `BRCTL1`设置为 0x00000040,配置串口的时钟频率相关参数。   - `HBRG1`设置为 0x0001U,用于高位波特率寄存器设置。   - `B1RG16`设置为 0x0001U,作为低位波特率寄存器设置。   - `EUBRGL1`设置为 0x00000022,进行扩展高位波特率寄存器设置。   - `EUBRGH1`设置为 0x00,完成扩展高位波特率寄存器的另一部分设置。   - 将`RC1IE`初始化为 0x0000U,用于串口接收中断使能设置。通过这些寄存器的设置,完成串口 1 的初始化程序,确保串口模块、接收器、发送状态和时钟频率都能正确配置。2. 数据发送:   - 重写 C 语言的库函数`putc`,定义`int fputc(int ch, FILE* stream)`函数。   - 在该函数中,将数据`ch`填充到发送数据寄存器`TXSDR1`。但为了更加严谨,应增加发送标志位的判断和处理,确保数据能够正确发送。在串口配置和数据发送过程中,要注意对不同波特率的支持和兼容性,以及可能出现的发送错误和接收错误的处理。**三、串口波特率配置**在电子通信领域,波特率即调制速率,指的是有效数据讯号调制载波的速率,单位时间内载波调制状态变化的次数。对于串口的波特率配置,需要先配置好主频时钟,再到串口进行分频和倍频,通过所需波特率反算分频和倍频。在进行波特率配置时,应充分考虑不同应用场景下对波特率的要求,以及可能出现的波特率误差和稳定性问题。可以通过实际测试和调整,确保串口通信的可靠性和准确性。
当mcu需要通信的时候,就需要使用一种通讯方式来进行通讯,刚好这款mcu有串口通讯,那就先把串口配置一下吧


RSCTL1 = 0x00000090;

TSCTL1 = 0x00000022;
BRCTL1 = 0x00000040;
HBRG1 = 0x0001U;

B1RG16 = 0x0001U;




EUBRGL1 = 0x00000022;
EUBRGH1 = 0x00;










RC1IE = 0x0000U;
RC1IE = 0x0000U;









以上完成串口1的初始化程序,分别配置了要使用的串口模块
串口模块的接收器
串口模块的发送状态
串口模块的时钟频率



在发送数据时,只需要往寄存器TXSDR1里填充数据就可以;






现在我们已经有了串口发送和主时钟,就可以循环发送hello world了


通过重写c语言的库函数putc函数就可以使用printf函数了




int fputc(int ch, FILE* stream)
{

    TXSDR1 = ch;//严谨来说需要增加发送标志位,此处留个坑
    return ch;
}











串口波特率配置:
虽然波特率很简单,但是温故而知新嘛,先让我们看看波特率是个啥。。
在电子通信领域,波特(Baud)即调制速率,指的是有效数据讯号调制载波的速率,即单位时间内载波调制状态变化的次数。[1]
今天我只是在串口配置中使用了波特率转换,所以这篇文章就只限于串口的波特率配置啦,
对于波特率,按照我自己的理解的话,假如你设置的波特率为9600,则在1秒内的通讯速率则是1/9600bps/s,由于波特率本身就代表一种速率,1/9600只是换了一种更加直观的表达方式罢了,根据串口的数据帧结构,
               
                          帧结构:0位起始位+10位数据位+0位奇偶较验位+1位停止位=11位 (我自己设置的串口数据帧)


总的来说,配置好主频时钟,再到串口进行分频和倍频,通过所需波特率反算分频和倍频

-------------------------------------------------------


假设需要使用串口打印当前的温度值,就是需要使用温度传感器获取温度值,而mcu读不到温度值,只能通过模拟量来间接读取温度值;
所以需要以下的功能框架来读取温度值;



那么,假设温度传感器传出的电压范围在0-5v,那么可以采用adc采集电路来完成mcu对温度的采集,如下的示意图;

想想这个方案好像可可行,那么就可以开始配置mcu的ADC了

ADCCTL0 = 0x10000001;

ADCCTL1 = 0x01000100;
ADCCTL2 = 0x0001;

START = 1;




当需要获取adc值的时候,通过获取adc结果寄存器,直接获取数据;
ADCDATA0H和ADCDATA0L寄存器分别保存了adc的高位数据和地位数据


**四、温度采集与控制**假设需要使用串口打印当前的温度值,由于 MCU 无法直接读取温度值,只能通过模拟量来间接读取温度值。可以采用 ADC 采集电路和温度传感器来完成 MCU 对温度的采集。1. ADC 配置:   - 设置`ADCCTL0`为 0x10000001,初始化 ADC 控制寄存器 0。   - `ADCCTL1`设置为 0x01000100,配置 ADC 控制寄存器 1。   - `ADCCTL2`设置为 0x0001,调整 ADC 控制寄存器 2 的参数。   - 将`START`设置为 1,启动 ADC 转换。2. 获取 ADC 值:   - 通过读取`ADCDATA0H`和`ADCDATA0L`寄存器分别获取 ADC 的高位数据和低位数据。3. 温度转换:   - 根据温度传感器的数据手册,将获取的 ADC 值转换成实际的温度值。这需要对温度传感器的特性有深入的了解,并进行准确的计算和转换。4. PWM 温度控制:   - 当 MCU 通过串口获取到温度指令后,发送 PWM 信号进行加热。   - 当 MCU 读取到温度到达指令后,停止 PWM 加热,实现简单的温度控制系统。在温度采集和控制部分,需要考虑 ADC 的精度、温度传感器的准确性、PWM 控制的稳定性以及整个系统的响应时间等因素。通过实际测试和优化,确保温度采集和控制的准确性和可靠性。---
现在可以获取温度adc了,但是需要把adc转换成温度,就需要通过温度传感器的语言了,它读取温度的时候,会把温度转换成电压传给你,那么你就需要把相应的电压转换成adc,再转换成温度,查询温度传感器的数据手册就可以获取这个了;

现在可以获取温度之后,就可以再使用pwm来控制温度了;
比如如下框架:

当mcu通过串口获取到温度指令后,就发送pwm加热,当mcu读取到温度到达指令后,就停止pwm加热;这样就实现了一个简单的温度控制系统;
理论上可行的话,就配置一下pwm吧;


----------------------20240817,MIN-------------------------------------------------------

































使用特权

评论回复

打赏榜单

21小跑堂 打赏了 30.00 元 2024-08-28
理由:恭喜通过原创审核!期待您更多的原创作品~

评论
uuguoleilei 2024-8-28 10:01 回复TA
@21小跑堂:感谢建议,一定抽出时间做出修改排版 
21小跑堂 2024-8-28 09:57 回复TA
8位单片机学习笔记,对一些常见外设进行开发记录。文章排版较为混乱,可读性较差,建议作者后续加强文章的排版管理。较好的排版和舒适的阅读体验有助于提升打赏额度哦。 
沙发
chenqianqian| | 2024-8-8 08:12 | 只看该作者
8位机寄存器比较简单,一般都是直接寄存器编程。

使用特权

评论回复
板凳
xionghaoyun| | 2024-8-8 10:12 | 只看该作者
还是库函数真香

使用特权

评论回复
地板
海洋无限| | 2024-8-8 12:19 | 只看该作者
可以先show出具体芯片型号

使用特权

评论回复
5
caigang13| | 2024-8-9 08:34 | 只看该作者
记得大学那会儿玩51单片机时,都是直接寄存器编程,因为就那么几个寄存器,外设也少。

使用特权

评论回复
6
tpgf| | 2024-8-10 11:22 | 只看该作者
8位单片机开发涵盖了硬件准备、程序编写以及功能模块的应用等核心内容

使用特权

评论回复
7
guanjiaer| | 2024-8-16 08:54 | 只看该作者
开发的第一步是选择合适的芯片,并深入了解芯片的资源

使用特权

评论回复
8
heimaojingzhang| | 2024-8-16 16:27 | 只看该作者
8位单片机一般使用直接寄存器编程,因为其寄存器数量较少,外设也相对简单

使用特权

评论回复
9
keaibukelian| | 2024-8-16 18:22 | 只看该作者
如果出现问题,可以使用逻辑分析仪等调试工具进行排查

使用特权

评论回复
10
paotangsan| | 2024-8-17 10:01 | 只看该作者
为减少实际硬件调试的次数,可以先通过软件仿真检查代码的逻辑错误。这样不仅可以节省时间,还能降低硬件损坏的风险

使用特权

评论回复
11
renzheshengui| | 2024-8-17 20:02 | 只看该作者
8位单片机开发涉及硬件选择、程序编写、模块应用、调试测试以及性能优化和扩展等多个方面

使用特权

评论回复
发新帖 本帖赏金 30.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

45

帖子

3

粉丝