• 大小: 2KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-07
  • 语言: 其他
  • 标签: stm8  uart  IO  模拟  

资源简介

STM8S003F只有一个串口,项目中需要两个串口,因此采用IO口模拟一个串口。 此程序也是经理给的,经过测试可以用,不过需要耐心阅读一下程序,理解串口程序的思路,能够正确读写串口温度传感器的温度值。

资源截图

代码片段和文件信息

#include “suart.h“
//#include “mh-z14.h“

SUART suart;

static void set_rx_input(void)
{
    PD_DDR &= ~(0x1 << 3);  //input
    PD_CR1 |= (0x1 << 3);   //pull up input
}

static void set_tx_output(void)
{
    PD_DDR |= (0x1 << 2);
    PD_CR1 |= (0x1 << 2);
    PD_CR2 |= (0x1 << 2);
}

void suart_init(void)
{
    set_rx_input();
    set_tx_output();
    TX = 1;
    
    memset(&suart 0 sizeof(SUART));
    suart.baudrate = 9600;
    suart.mode = RX_MODE;
    suart.rxnum = 9;
}

void rx_int_switch(u8 flag)
{
    if (flag) {
        PD_CR2 |= (0x1 << 3);   //enable ext int
        EXTI_CR1 &= (u8)(~MASK_EXTI_CR1_PDIS);
        EXTI_CR1 |= (u8)((u8)(0x02) << 6);    /* 设置为下降沿触发中断 */
    } else {
        PD_CR2 &= ~(0x1 << 3);  //disable ext int
    }
}

void tx_input_data(u16 data)
{
    u16 i = suart.txbuf.num txchar = 0;
    
    txchar = data;  //data bit: 8bits
    txchar <<= 1;   //start bit: 1bit        
    //parity bit: no
    txchar |= (0x3 << 9);   //stop bit: 2bits
    
    suart.txbuf.data[i] = txchar;
    suart.txbuf.num++;
}

void tx_handler(void)
{
    u32 data = 0 a = 0;
    
    a = (suart.txbuf.data[suart.txbuf.txcnt] >> suart.txbuf.txbit);   //移位获取需要发送的电平
    data = (a & 0x01);
    if (data == 0x01)
        TX = 1;
    else
        TX = 0;
    
    suart.txbuf.txbit++;
    if (suart.txbuf.txbit == 11) {    //发送完停止位进行判断是否关闭定时器
        suart.txbuf.txbit = 0;
        suart.txbuf.txcnt++;
        
        if (suart.txbuf.txcnt == suart.txbuf.num) { //当发送缓冲队列中数据全部发完时初始化相关资源
            suart.txbuf.txcnt = 0;
            suart.txbuf.num = 0;
            
            tim2_switch(OFF 0 TX_MODE);
            rx_int_switch(ON);
        }
    }
}

static u8 get_rx_bit(void)
{
    u8 i = 0 bitsum = 0;
    
    for (; i < 3; i++)
        bitsum += RX;
    
    if (bitsum < 2)
        return 0;
    else
        return 1;
}

void rx_handler(void)
{
    u8 averbit = 0;
    
    averbit = get_rx_bit(); //连续采三次电平值,根据最大比合并,得出电平值
    
    if (suart.rxbuf.rxbit == 0) {
        if (averbit)    
            rx_enable();   
        else   
            tim2_switch(ON suart.baudrate RX_MODE);
        
        suart.rxbuf.rxbit++;
    } else {
        if (suart.rxbuf.rxbit < 9) {  
            suart.rxbuf.SBUF >>= 1;  
            
            if (averbit)
                suart.rxbuf.SBUF |= (0x1 << 7);
            
            suart.rxbuf.rxbit++;
        } else {  //stop bit
            tim2_switch(OFF 0 RX_MODE);
            if (averbit) {  
                suart.rxbuf.data[suart.rxbuf.num] = suart.rxbuf.SBUF;
                suart.rxbuf.num++;
            }
            
            if (suart.rxnum != suart.rxbuf.num)
                rx_enable(); 
            else { 
#if 0
                u8 i = 0;
                for (; i < suart.rxnum; i++)
                    tx_input_data(suart.rxbuf.data[i]);
                tx_ena

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        3714  2017-02-26 14:40  suart.c
     文件         904  2016-06-27 08:51  suart.h

评论

共有 条评论