K60学习笔记五:串行通信的时序分析

串行通信的特点:数据以字节为单位,按位的优先级来进行传送
通信涉及通信协议
通信协议按照时间来分:可分为同步通信和异步通信
按照发送数据的位宽来分可分为:串行通信和并行通信
串行通信又分为单工,半双工,全双工
同步通信是面向比特的传输
异步通信是面向字符的传输,需要事先约定波特率
异步通信的空闲格式为1,发送器通过0来表示传送开始,随后传送数据位,再然后发送一到两位的停止位,来停止。
从开始位到停止位称为一帧。
因为没发送一个数据都要发送一个开始位,所以称为异步

串行通信的波特率:
位长:称为位的持续时间,其倒数就是单位时间内传递的位数。人们把每秒传送的位数称为波特率

看了一下数据手册UART 的配置寄存器好多
看了一下书:
UART寄存器初始化步骤:
使能UART时钟
设置UART的服用引脚
先禁止UART发送和接收,以便后续配置UART
设置UART的数据格式,奇偶校验位–停止位数固定为1
设置UART的波特率
如果需要FIFO,还要使能FIFO
使能UART发送和接收
—配置过程好复杂··
PLL锁相环,可以将晶振输出频率Fosc,倍增几倍,以满足高速运算需要。 在不连接PLL时,CPU时钟和晶振时钟相同,即CCLK = Fosc。 当使能PLL并连接,则CCLK = Fosc * M,M为倍频数。
锁相环和锁频环的锁定以及捕获、同步等概念是有区别的。对锁相环而言,所谓锁定是指VCO频率与同步信号频率完全一致,但允许有稳定相位误差;而对锁频环而言,则在锁定时可允许VCO与同步信号有小的稳态频率误差。

关于晶振:
时钟电路
MK60 的时钟电路包括两部分,一个是芯片的主晶振,用于产生芯片和外设所需要的工作时钟;另外一个是实时时钟RTC 的时钟电路,实时时钟(RTC-Real Time Clock)提供一套计数器在系统上电和关闭操作时对时间进行测量,RTC 消耗的功率非常低。蓝
宙电子的K60 系统板的主晶振使用的是50MHz 的有源晶振。
K60 的RTC 时钟由独立的32.768KHz 振荡器来提供。

void uart_init (UARTn_e uratn, uint32 baud)
{
    register uint16 sbr, osr;
    uint8 temp;
    uint32 sysclk,tmp_baud;     //时钟
    uint16 tmp_diff=~0,tmp_sbr,diff_abs_baud;

    /* 配置 UART功能的 复用管脚 */
    switch(uratn)
    {
    case UART0:
        SIM_SCGC4 |= SIM_SCGC4_UART0_MASK;      //使能 UART0 时钟

        if(UART0_RX_PIN == PTA1)
        {
            port_init( UART0_RX_PIN, ALT2);
        }
        else if((UART0_RX_PIN == PTA15)  || (UART0_RX_PIN == PTB16) || (UART0_RX_PIN == PTD6) )
        {
            port_init( UART0_RX_PIN, ALT3);
        }
        else
        {
            ASSERT(0);                           //上诉条件都不满足,直接断言失败了,设置管脚有误?
        }

        if(UART0_TX_PIN == PTA2)
        {
            port_init
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于kl25z主控、3144霍尔传感器和液晶显示器DV12864G的代码,用于计算轮子速度和距离: ```c #include "MKL25Z4.h" #include "stdio.h" #include "math.h" #define PI 3.14159265358979323846 #define CLOCKS_PER_SEC 1000 volatile int cnt = 0; volatile int speed = 0; volatile int distance = 0; void PORTA_IRQHandler(void) { if ((PORTA->PCR[13] & 0x01000000) != 0) { cnt++; PORTA->PCR[13] |= 0x01000000; } } void TPM0_IRQHandler(void) { TPM0->SC |= 0x80; speed = (cnt * 60 * CLOCKS_PER_SEC) / (2 * 20 * TPM0->MOD); distance += 2 * PI * 0.05 / 20; cnt = 0; } void init_hall_sensor(void) { SIM->SCGC5 |= 0x200; PORTA->PCR[13] |= 0x00000110; NVIC_EnableIRQ(PORTA_IRQn); } void init_tpm(void) { SIM->SCGC6 |= 0x01000000; SIM->SOPT2 |= 0x01000000; TPM0->SC = 0; TPM0->SC = 0x07; TPM0->MOD = 5000; TPM0->SC |= 0x80; NVIC_EnableIRQ(TPM0_IRQn); } void init_lcd(void) { SIM->SCGC5 |= 0x1000; PORTD->PCR[0] |= 0x00000100; PORTD->PCR[1] |= 0x00000100; PORTD->PCR[2] |= 0x00000100; PORTD->PCR[3] |= 0x00000100; PORTD->PCR[4] |= 0x00000100; PORTD->PCR[5] |= 0x00000100; PORTD->PCR[6] |= 0x00000100; PORTD->PCR[7] |= 0x00000100; PTD->PDDR = 0xff; PTD->PDOR = 0xff; PTD->PDOR = 0x3f; PTD->PDOR = 0x1f; PTD->PDOR = 0x0f; PTD->PDOR = 0x07; PTD->PDOR = 0x03; PTD->PDOR = 0x01; PTD->PDOR = 0x00; } void lcd_cmd(unsigned char cmd) { PTD->PDOR = cmd; PTD->PDOR = cmd | 0x80; PTD->PDOR = cmd; } void lcd_data(unsigned char data) { PTD->PDOR = data; PTD->PDOR = data | 0x80; PTD->PDOR = data; } void lcd_clear(void) { lcd_cmd(0x01); for (int i = 0; i < 10000; i++); } void lcd_putc(unsigned char c) { lcd_data(c); } void lcd_puts(char *s) { while (*s) { lcd_putc(*s++); } } void init_sys(void) { init_hall_sensor(); init_tpm(); init_lcd(); } int main() { init_sys(); lcd_clear(); lcd_puts("Speed: "); lcd_puts("Distance: "); while (1) { char buf[16]; sprintf(buf, "%d", speed); lcd_cmd(0x80 + 7); lcd_puts(buf); sprintf(buf, "%d", distance); lcd_cmd(0x80 + 17); lcd_puts(buf); for (int i = 0; i < 1000000; i++); } } ``` 代码中使用了两个中断,一个用于检测霍尔传感器的计数器,另一个用于更新速度和距离。在初始化函数中,初始化了霍尔传感器、计时器和液晶显示器。在主循环中,将速度和距离输出到液晶显示器上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值