通用io模拟串口

移植方法


image.png

.h文件

#ifndef MCU_IO_H____
#define MCU_IO_H____

/*
共10bit(bit0-->0  bit1---bit8  bit9-->1 )
1uart通讯协议是以8个bit为 一帧,传输的时候低位在前,高位在后
2为了区分每一个帧的开头,在每一帧之前,要有一个0作为开头,之后就是传输的8bit字节,传输8bit后跟一个1,最为结束
3在1之后,有的通讯还发送一个校验位,目前大部分是不要校验位的,这里也不要

波特率 bps  位每秒
以9600bps来传送数据时,每一位持续的时间是 (1/9600)s
每一位的时间 tus=1000000/baud  9600-->104.17us

技巧:为了接收的不错位,接收到开始位,后等待半个周期再接收数据
*/


#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdbool.h>


typedef unsigned char  uart_u8;
typedef unsigned short  uart_u16;
typedef unsigned long  uart_u32;
typedef void (*tx_high_fun)(void);
typedef void (*tx_low_fun)(void);
typedef bool (*rx_value_fun)(void);


void  need_timer_call(void);    //Timer time to call
void  need_rx_hight2low_call(void);//rx irq high to low call
void need_write_byte(uart_u8 *pdata,uart_u16 len); //uart send data
bool need_read_byte(uint8_t *pdata);//uart read data,if read one ,return true

/*
init interface
baud :wanted baud
txfunhigh:tx pin hight function
txfunlow:tx pin low function
rxvalue:read rx pin value function

return: The time, in us, required
*/
int need_init(int baud,tx_high_fun txfunhigh,tx_low_fun txfunlow,rx_value_fun  rxvalue);






/*example*/

#if 0
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"

#include "driver/gpio.h"

#include "esp_log.h"
#include "esp_system.h"


#include "string.h"

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"

#include "esp_log.h"

#include "driver/gpio.h"
#include "driver/hw_timer.h"

#define MCU_IO_GPIO_RX_PIN  13
#define MCU_IO_GPIO_TX_PIN   12  


void tx_hight(void)
{
 gpio_set_level(MCU_IO_GPIO_TX_PIN, 1) 

}

void tx_low(void)
{
 gpio_set_level(MCU_IO_GPIO_TX_PIN, 0) 

}

bool rx_value(void)
{
return gpio_get_level(MCU_IO_GPIO_RX_PIN) ? true :false;
}
static void rx_gpio_isr_handler(void *arg)
{
need_rx_hight2low_call();

}


static void hw_timer_callback(void *arg)
{
need_timer_call();
}
void init_debug_uart(void)
{



    gpio_config_t io_conf;
    //disable interrupt
    io_conf.intr_type = GPIO_INTR_DISABLE;
    //set as output mode
    io_conf.mode = GPIO_MODE_OUTPUT;
    //bit mask of the pins that you want to set,e.g.GPIO15/16
    io_conf.pin_bit_mask = 1ULL<<MCU_IO_GPIO_TX_PIN;
    //disable pull-down mode
    io_conf.pull_down_en = 0;
    //disable pull-up mode
    io_conf.pull_up_en = 0;
    //configure GPIO with the given settings
    gpio_config(&io_conf);

    gpio_set_level(MCU_IO_GPIO_TX_PIN, 1);


    //disable interrupt
    io_conf.intr_type = GPIO_INTR_NEGEDGE;
    //set as output mode
    io_conf.mode = GPIO_MODE_INPUT;
    //bit mask of the pins that you want to set,e.g.GPIO15/16
    io_conf.pin_bit_mask = 1ULL<<MCU_IO_GPIO_RX_PIN;
    //disable pull-down mode
    io_conf.pull_down_en = 0;
    //disable pull-up mode
    io_conf.pull_up_en = 0;
    //configure GPIO with the given settings
    gpio_config(&io_conf);

   gpio_install_isr_service(0);
   gpio_isr_handler_add(MCU_IO_GPIO_RX_PIN, rx_gpio_isr_handler, (void *)(MCU_IO_GPIO_RX_PIN));


    hw_timer_init(hw_timer_callback, NULL);
    hw_timer_alarm_us(need_init(4800,tx_hight,tx_low, rx_value), true);

}

#endif



#endif




.c文件

#include "mcu_io_uart.h"

#define USE_TIMER  2
tx_high_fun need_tx_high;
tx_low_fun need_tx_low;
rx_value_fun need_rx_value;
void irq_write_byte(void);
static void irq_data_data(void);


static uart_u8 tickr=0,wait_rev_data=0,rev_data=0,rev_err=0,r_bit=0;

//定时器时间到调用
void  need_timer_call(void)
{
    static uart_u8 tick;
    tick++;
    tickr++;
    if(tick>=USE_TIMER)
    {
        tick=0;
        irq_write_byte();
    }

    irq_data_data();



}


//rx管脚低电平中断带哦用
void  need_rx_hight2low_call(void)
{

    if(wait_rev_data) return;
//    while(NED_READ_RX()==0);

    tickr=0;
    rev_data=0;
    wait_rev_data=1;
    rev_err=0;
    r_bit=0;



}

#define DATA_LEN 256
uart_u8 Rbuf[DATA_LEN];
uart_u16 in=0,out=0;
//uart read data,if read one ,return true
bool need_read_byte(uint8_t *pdata)
{

    if(in==out)
    {
        return false;
    }
    else
    {
        *pdata = Rbuf[out];
        out++;
        out%=DATA_LEN;
        return true;
    }
}

#if (USE_TIMER == 4)
const uart_u8 bit8num[9]= {6,10,14,18,22,26,30,34,38};
#else (USE_TIMER == 2)
const uart_u8 bit8num[9]= {3,5,7,9,11,13,15,17,19};
#endif

static void irq_data_data(void)
{
#define TIME_BIT(A)  (USE_TIMER/2+USE_TIMER*(A+1))
    if(wait_rev_data == 0 || tickr == 0)return ;


//       if(bit8num[r_bit]==tickr)
//        {
//            if(NED_READ_RX() && r_bit<=7)
//            {
//            rev_data|=0x01<<r_bit;
//            }
//            if(r_bit==8 && (0==NED_READ_RX()))
//            {
//                rev_err=1;
//                return;
//            }
//            r_bit++;
//        }else  if(tickr==(10*USE_TIMER))
//        {
//
//            if(0==rev_err)
//            {
//            Rbuf[in]=rev_data;
//            in++;
//            in%=DATA_LEN;
//            }
//            wait_rev_data=0;
//        }

    if(bit8num[r_bit]==tickr)
    {
        if(need_rx_value() && r_bit<=7)
        {
            rev_data|=0x01<<r_bit;
        }
        if(r_bit==8 )
        {
            if(need_rx_value())
            {
                Rbuf[in]=rev_data;
                in++;
                in%=DATA_LEN;
            }
            wait_rev_data=0;
            return;
        }
        r_bit++;
    }


}

static volatile uart_u8 *dta;
static volatile uart_u16 max_slen;
static volatile uart_u8 s_bits,s_bytes;
void irq_write_byte(void)
{
    uart_u8 n;

    if(max_slen == 0 )return;
    if( 0==s_bits )
    {
        need_tx_low();
    }
    else if( 9==s_bits )
    {
        need_tx_high();
        s_bytes++;
        if(max_slen==s_bytes)
        {
            max_slen=0;

        }
        s_bits=0;
        return;
    }
    else
    {
        n=((dta[s_bytes]>>(s_bits-1))&0x01);
        if(n)
        {
            need_tx_high();
        }
        else
        {
            need_tx_low();
        }
    }
    s_bits++;

}


//uart send data
void need_write_byte(uart_u8 *pdata,uart_u16 len)
{

//    while(max_slen);
    s_bits=0;
    s_bytes=0;
    dta=pdata;
    max_slen = len;
    while(max_slen);


}

/*
init interface
baud :wanted baud
txfunhigh:tx pin hight function
txfunlow:tx pin low function
rxvalue:read rx pin value function

return: The time, in us, required
*/
int need_init(int baud,tx_high_fun txfunhigh,tx_low_fun txfunlow,rx_value_fun  rxvalue)
{

 need_tx_high=txfunhigh;
 need_tx_low=txfunlow;
 need_rx_value=rxvalue;

 return (1000000/USE_TIMER/baud);
}






最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容