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

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

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

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

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



最大频率只有16M,那也够用了豁
那我们就先把时钟配置一下,简单定时一下可以让芯片运行时间片吧
代码如下;
先配置晶振的两个引脚,让它激活一下晶振先;

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

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






再配置一下频率

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需要通信的时候,就需要使用一种通讯方式来进行通讯,刚好这款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的高位数据和地位数据




现在可以获取温度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元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

26

帖子

3

粉丝