眼睛痒是什么原因| 银行卡开户名是什么| 眼痒痒是什么原因引起| 什么的春天| 恳谈会是什么意思| 有的没的是什么意思| aosc医学是什么意思| 长命的动物是什么生肖| 蝙蝠长什么样| 静怡是什么意思| 四个雷念什么| 海蜇是什么动物| 肺结节是什么原因| 孩子疱疹性咽峡炎吃什么药| c2驾驶证能开什么车| 吊兰开花有什么兆头| 蔷薇色是什么颜色| 什么是先兆流产| 四季常青财运旺是什么生肖| swell是什么牌子| 多囊是什么原因引起的| 肚子上面疼是什么原因| 黑色屎是什么原因| 黄酒有什么功效与作用| 柔式按摩是什么意思| 阳虚有什么症状和表现| 子宫内膜增厚是什么原因引起的| ex什么意思| 农历7月是什么星座| 海椒是什么辣椒| 腌羊肉串放什么调料| 甲亢挂什么科室| 九斗一簸箕有什么说法| 女人得性瘾什么症状| 减肥吃什么水果| 脑供血不足用什么药| 划扣是什么意思| 出汗有异味是什么原因| loho眼镜属于什么档次| 弥漫性病变是什么意思| 农历3月12日是什么星座| 22年属什么生肖| 扁平化管理是什么意思| 什么是朱砂| 急性会厌炎吃什么药| 什么是文字狱| 荆棘是什么植物| 94年属狗什么命| 什么样的人不适合吃人参| 皮肤黑适合什么颜色的衣服| 扁平比是什么意思| 什么是甲减病| 珐琅是什么| 什么是基因突变| 祖师香是什么意思| 木加号读什么| 遗精是什么原因| 梦见苹果是什么意思| 月柱金舆是什么意思| 前列腺用什么药| 低密度脂蛋白低是什么原因| 国药准字h代表什么| 路人甲是什么意思| 谷丙转氨酶偏高是什么原因| 0型血和b型血生的孩子是什么血型| 嗯嗯什么意思| 怀孕后的分泌物是什么样的| 旅长是什么级别| 陕西有什么特产| 非洲人一日三餐吃什么| 扁平足是什么样子图片| 赭石色是什么颜色| 白羊座上升星座是什么| 晚的反义词是什么| 女生过生日送什么礼物好| 放屁特别臭是什么原因| 牙疼吃什么饭菜比较好| 水瓶座与什么星座最配| 爬是什么结构| 孙子的儿子叫什么| 月寸读什么| 冻结账户需要什么条件| MC是什么牌子的车| 头部爱出汗是什么原因| 五指毛桃长什么样子| 传媒公司是做什么的| 脚底发麻是什么原因| 屋尘螨和粉尘螨是什么| 为什么血液是红色的| 什么样的眼睛| 手淫过度吃什么药调理| 什么是蝴蝶宝宝| 吴用属什么生肖| 314是什么日子| 什么人适合吃蛋白质粉| 什么面粉最好| 心室早复极是什么意思| 胆管结石用什么药能把它除掉| 阴唇痒是什么原因| 为什么身上一热就痒| 桐字属于五行属什么| 3.8号是什么星座| 抠脚大汉什么意思| 轻度郁症有什么表现| 舌质是什么| 2013属什么生肖| 鼻塞一直不好什么原因| 吃什么养肺| 制动是什么意思| 凝血功能是什么意思| 鸡胸挂什么科| 什么的小花| 噤若寒蝉是什么意思| 六月六是什么日子| 田字出头是什么字| 副书记是什么级别| 88年属什么的| 嗓子疼有痰吃什么药| 枣子什么时候成熟| 眼睛为什么会近视| 手足口病吃什么药好得快| 维生素c弱阳性是什么意思| 淀粉吃多了有什么危害| vmax什么意思| 精子是什么味道| 11号来月经什么时候是排卵期| 右边小腹疼是什么原因女性| castle什么意思| 吃什么可以缓解痛经| 家庭主妇是什么意思| 中学为体西学为用是什么意思| 胃不好吃什么蔬菜| 喉咙痛咽口水都痛吃什么药| 战略支援部队是干什么的| 长白头发了吃什么才能把头发变黑| 什么原因导致脑出血| 朝三暮四是什么生肖| 鸭肉炖什么好吃| 人工肝是什么意思| 大便黑色的是什么原因| 冰箱不制冷是什么问题| 什么车| 常温保存是什么意思| 笑面虎什么意思| 冬虫夏草是什么| 北极为什么没有企鹅| 血栓是什么病| 为什么拉黑色的屎| 什么玉最值钱| 胃炎是什么原因引起的| 妈妈的舅舅叫什么| 7.4是什么星座| 宿便什么意思| 灰指甲用什么药效果好| 睡觉咬牙齿是什么原因引起的| 望远镜什么牌子好| 神经紊乱会出现什么症状| 副团级是什么军衔| 金字旁加女念什么字| 高氨血症是什么病| 汶字五行属什么| 东坡肉是什么菜系| 亚蒂息肉是什么意思| 心外科是看什么病的| 什么时候拔罐最好| 4月27日是什么星座| 北京都有什么大学| 绿豆有什么功效| 15朵玫瑰花代表什么意思| 封建迷信是什么| 什么叫室性早搏| 特需门诊和专家门诊有什么区别| 口腔溃疡反反复复是什么原因| 峦读什么| 喝什么能减肥| 胎儿右肾盂分离是什么意思| 两性关系是什么意思| 化气行水是什么意思| 今天是个什么日子| 人参吃了有什么好处| complete是什么意思| 灵芝适合什么样的人吃| 禄神是什么意思| 手发抖是什么原因引起的年轻人| 凉虾是什么| 三元及第是什么意思| 瓜子脸适合什么眼镜| 女贞子是什么| 吃过期药有什么危害| 老年人吃什么水果好| 做梦和别人吵架意味着什么| 人参有什么作用| 吉祥动物是什么生肖| 三个火读什么| 11.16是什么星座| 血脂高吃什么水果| 甲状腺结节吃什么中药| 女性虚火旺吃什么下火| 八面玲珑指什么生肖| 荨麻疹什么东西不能吃| 东风破是什么意思| 床榻是什么意思| 唐卡是什么| 境遇是什么意思| 黄体酮不足吃什么药| 来月经为什么会拉肚子| 逢九年应该注意什么有什么禁忌| 为什么下巴经常长痘痘| 榅桲是什么水果| 是什么原因导致肥胖| 脸很黄是什么原因| 水泡型脚气用什么药| 风水轮流转什么意思| 孩子脚后跟疼是什么原因| 六月十一是什么日子| 什么叫银屑病| mmhg是什么意思| 烫伤后擦什么药好得快| 行尸走肉什么意思| 脚疼是什么原因引起的| 补钙吃什么维生素| 中文是什么意思| 嗳腐吞酸是什么意思| 小金鱼吃什么食物| 盐酸对人体有什么危害| 浩浩荡荡是什么意思| 王安石字什么号什么| 狮子座女和什么座最配| 一什么猪| 右肺中叶小结节是什么意思严重吗| 花开半夏什么意思| 绿豆可以和什么一起煮| 甲氰咪胍又叫什么| 肆无忌惮的意思是什么| 94年属什么的| 1991年属羊的是什么命| 三个山是什么字| 什么是龟头炎| 孕妇胃疼可以吃什么药| 左耳朵嗡嗡响是什么原因引起的| 抑郁是什么意思| 口加一笔变成什么字| 性张力什么意思| 看走眼是什么意思| 路政属于什么单位| 睡觉打鼾是什么原因| 无限极是干什么的| 寒湿体质吃什么中成药| 乳腺导管扩张是什么意思严重吗| 清明节一般开什么生肖| 穗是什么意思| 淋巴滤泡增生吃什么药| 高校自主招生是什么意思| 湿吻是什么意思| 夏天吹空调感冒了吃什么药| 什么是不动产权证| ogtt是什么意思| 5月17日是什么星座| 精神支柱是什么意思| 达英35是什么药| 说女人强势是什么意思| 标新立异是什么意思| 少将是什么级别| 男生做爱什么感觉| 百度
打印
[STM32F1]

[全国政协十三届一次会议闭幕会]全国政协主席汪洋发表讲话

[复制链接]
427|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jkl21|  楼主 | 2024-9-22 17:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


#include "UartSet.h"
#include "string.h"

typedef enum
{
    TimeRecvStartStep1 = 0,
    TimeRecvStep2 = 1,
    TimeRecvStep3 = 2,
    TimeRecvStep1 = 3,
    TimeSendStep = 4,

} TimeStep;

uint16_t TimeSet[5];

uint16_t TimeSetBuff[][5] = {{1199, 59, 59, 2378, 2498 }, //1200
    {539, 59, 59, 1128, 1247 },  //2400
    {239, 59, 59, 503, 624  },   //4800
    {149, 29, 29, 251, 311  },   //9600
    {0, 0, 0, 0, 0    },         //预留
};

UART gsUARTBuff;                //定义串口

uint8_t ucRecvData = 0;         //每次接收的字节
uint8_t ucAcquCx = 0;           //三次滤波计数
uint8_t ucRecvBitCx = 0;        //接收位计数
uint8_t ucSendBitCx = 0;        //发送位计数
uint8_t ucSendLengCx = 0;       //发送长度计数

uint8_t ucRecvBitBuff = 0;       //采集位保存


TIM_HandleTypeDef htim6;

void MX_TIM6_Init(void)
{

    __HAL_RCC_TIM6_CLK_ENABLE();

    htim6.Instance = TIM6;
    htim6.Init.Prescaler = 15;
    htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim6.Init.Period = TimeSet[TimeRecvStartStep1];
    htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

    HAL_NVIC_SetPriority(TIM6_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM6_IRQn);

    HAL_TIM_Base_Init(&htim6);

}


void UART_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitStruct.Pin = COM_TX_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(COM_TX_GPIO_Port, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = COM_RX_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(COM_RX_GPIO_Port, &GPIO_InitStruct);

    HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);

}


/*******************************************************************************
* @FunctionName   : UART_Init.
* [url=home.php?mod=space&uid=1841158]@description[/url]    : 模拟串口结构体初始化.
* [url=home.php?mod=space&uid=108799]@Input[/url]          : None.
* [url=home.php?mod=space&uid=327807]@output[/url]         : None.
* [url=home.php?mod=space&uid=266161]@return[/url]         : None.
* @Author&Data    : MrShuCai  2019.4.11.
*******************************************************************************/
void UART_Init(void)
{
    gsUARTBuff.CheckType = NONE;
    gsUARTBuff.UartMaxLength = Uartlength;
    gsUARTBuff.UartStat = COM_NONE_BIT_DEAL;
    UART_GPIO_Init();

    if(BaudRate == 1200)
    {
        memcpy(TimeSet, &TimeSetBuff[0][0], sizeof(TimeSet));
    }
    else if(BaudRate == 2400)
    {
        memcpy(TimeSet, &TimeSetBuff[1][0], sizeof(TimeSet));
    }
    else if(BaudRate == 4800)
    {
        memcpy(TimeSet, &TimeSetBuff[2][0], sizeof(TimeSet));
    }
    else if(BaudRate == 9600)
    {
        memcpy(TimeSet, &TimeSetBuff[3][0], sizeof(TimeSet));
    }
    else
    {

    }

    MX_TIM6_Init();
}


/*******************************************************************************
* @FunctionName   : UART_Send_Data.
* @Description    : 模拟串口发送数据接口.
* @Input          : None.
* @Output         : None.
* @Return         : None.
* @Author&Data    : MrShuCai  2019.4.11.
*******************************************************************************/
void UART_Send_Data(uint8_t * data, uint8_t size)
{
    gsUARTBuff.Sendlength = size;
    memcpy(gsUARTBuff.UART_Send_buf, data, size);
   
      if(gsUARTBuff.UartStat == COM_NONE_BIT_DEAL)
        {
            gsUARTBuff.TxEn = 1;
            gsUARTBuff.RxEn = 0;
            gsUARTBuff.UartStat = COM_START_BIT_DEAL;

            TIM6->ARR = TimeSet[TimeSendStep];
            TIM6->EGR = TIM_EGR_UG;

            HAL_TIM_Base_Start_IT(&htim6);
        }
      
}


/*******************************************************************************
* @FunctionName   : EXTI4_15_IRQHandler.
* @Description    : 接收引脚外部中断,下降沿触发,触发后即进入起始位判断.
* @Input          : None.
* @Output         : None.
* @Return         : None.
* @Author&Data    : MrShuCai  2019.4.11.
*******************************************************************************/
void EXTI4_15_IRQHandler(void)
{
    if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_4) != RESET)
    {
        __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);

        if(gsUARTBuff.UartStat == COM_NONE_BIT_DEAL)
        {
            gsUARTBuff.RxEn = 1;
            ucRecvData = 0;
            gsUARTBuff.UartStat = COM_START_BIT_DEAL;

            TIM6->ARR = TimeSet[TimeRecvStartStep1];
            TIM6->EGR = TIM_EGR_UG;                  //初始化定时器
                      EXTI->IMR &= ~(0x10);
                      EXTI->EMR &= ~(0x10);
            HAL_TIM_Base_Start_IT(&htim6);
        }
    }

}


/*******************************************************************************
* @FunctionName   : BitValueChk.
* @Description    : 判断采集bit值,三次中为1的次数大于等于2则值为1否则为0.
* @Input          : n 采集记录的位值.
* @Output         : BitValue.
* @Return         : BitValue.
* @Author&Data    : MrShuCai  2019.5.1.
*******************************************************************************/
uint8_t BitValueChk(uint8_t n)
{
    uint8_t BitValCx = 0;

    for(BitValCx = 0; n; n >>= 1)
    {
        BitValCx += n & 0x01;
    }

    return (BitValCx < 2) ? (0) : (1);

}

/*******************************************************************************
* @FunctionName   : TIM6_IRQHandler.
* @Description    : 中断处理函数,包括发送和接收两部分.
* @Input          : None.
* @Output         : None.
* @Return         : None.
* @Author&Data    : MrShuCai  2019.4.11.
*******************************************************************************/
void TIM6_IRQHandler(void)
{

    HAL_TIM_IRQHandler(&htim6);

    if(gsUARTBuff.TxEn == 1)         /*数据发送,发送优先,无发送后才进入接收状态*/
    {
        switch(gsUARTBuff.UartStat)  /*串口发送位状态判断*/
        {
        case COM_START_BIT_DEAL :
        {
            HAL_GPIO_WritePin(COM_TX_GPIO_Port, COM_TX_Pin, GPIO_PIN_RESET);
            gsUARTBuff.UartStat = COM_DATA_BIT_DEAL;
            ucSendBitCx = 0;
        }
        break;

        case COM_DATA_BIT_DEAL :
        {
            HAL_GPIO_WritePin(COM_TX_GPIO_Port, COM_TX_Pin, (GPIO_PinState)((gsUARTBuff.UART_Send_buf[ucSendLengCx] >> ucSendBitCx) & 0x01));

            ucSendBitCx ++;

            if(ucSendBitCx >= 8)
            {
                if(gsUARTBuff.CheckType == NONE)
                {
                    gsUARTBuff.UartStat = COM_STOP_BIT_DEAL;
                }
                else
                {
                    gsUARTBuff.UartStat = COM_CHECK_BIT_DEAL;
                }
            }

        }
        break;

        case COM_CHECK_BIT_DEAL :
        {

        }
        break;

        case COM_STOP_BIT_DEAL :
        {
            HAL_GPIO_WritePin(COM_TX_GPIO_Port, COM_TX_Pin, GPIO_PIN_SET);

            ucSendBitCx = 0;

            if(ucSendLengCx < gsUARTBuff.Sendlength - 1)
            {
                gsUARTBuff.UartStat = COM_START_BIT_DEAL;
                ucSendLengCx ++;
            }
            else
            {
                ucSendLengCx = 0;
                gsUARTBuff.UartStat = COM_NONE_BIT_DEAL;
                gsUARTBuff.TxEn = 0;
                gsUARTBuff.RxEn = 1;
                HAL_TIM_Base_Stop_IT(&htim6);
                              EXTI->IMR |= 0x10;
                          EXTI->EMR |= 0x10;
                TIM6 ->CNT = 0;
            }

        }
        break;

        default:
            break;

        }
    }


    if(gsUARTBuff.RxEn == 1)
    {
        switch(gsUARTBuff.UartStat)
        {
                    case COM_START_BIT_DEAL :
                    {
                            ucRecvBitBuff = (ucRecvBitBuff << 1) | (HAL_GPIO_ReadPin(COM_RX_GPIO_Port, COM_RX_Pin) & 0x01);

                            if(++ ucAcquCx >= 3)
                            {
                                    if(BitValueChk(ucRecvBitBuff) == 0)                        
                                    {
                                            gsUARTBuff.UartStat = COM_DATA_BIT_DEAL;
                                            TIM6->ARR = TimeSet[ucAcquCx];
                                    }
                                    else
                                    {
                                            gsUARTBuff.UartStat = COM_STOP_BIT_DEAL;
                                    }
                                    
                                    ucRecvBitBuff = 0;
                                    ucAcquCx = 0;
                            }
                            else
                            {
                                    TIM6->ARR = TimeSet[ucAcquCx];
                            }


                    }
                    break;

                    case COM_DATA_BIT_DEAL :                         //数据位
                    {

                            ucRecvBitBuff = (ucRecvBitBuff << 1) | (HAL_GPIO_ReadPin(COM_RX_GPIO_Port, COM_RX_Pin) & 0x01);

                            if(++ ucAcquCx >= 3)
                            {
                                    ucRecvData |= (BitValueChk(ucRecvBitBuff) & 0x01) << ucRecvBitCx;

                                    if(ucRecvBitCx >= 7)
                                    {
                                            ucRecvBitCx = 0;

                                            if(gsUARTBuff.CheckType == NONE)
                                            {
                                                    gsUARTBuff.UartStat = COM_STOP_BIT_DEAL;
                                            }
                                            else
                                            {
                                                    gsUARTBuff.UartStat = COM_CHECK_BIT_DEAL;
                                            }
                                    }
                                    else
                                    {
                                            ucRecvBitCx ++;
                                    }

                                    TIM6->ARR = TimeSet[ucAcquCx];

                                    ucAcquCx = 0;
                                    ucRecvBitBuff = 0;
                            }
                            else
                            {
                                    TIM6->ARR = TimeSet[ucAcquCx];
                            }
                    }
                    break;

                    case COM_CHECK_BIT_DEAL :                         //校验位
                    {

                    }
                    break;

                    case COM_STOP_BIT_DEAL :                         //停止位
                    {

                        ucRecvBitBuff = (ucRecvBitBuff << 1) | (HAL_GPIO_ReadPin(COM_RX_GPIO_Port, COM_RX_Pin) & 0x01);

                            if( ++ ucAcquCx >= 3)
                            {
                                    if(BitValueChk(ucRecvBitBuff) == 1)   
                                    {
                                            if(gsUARTBuff.Recvlength < gsUARTBuff.UartMaxLength)
                                            {
                                                    gsUARTBuff.UART_Recv_buf[gsUARTBuff.Recvlength] = ucRecvData;
                                                    gsUARTBuff.Recvlength ++;
                                            }

                                            gsUARTBuff.UartStat = COM_NONE_BIT_DEAL;
                                            HAL_TIM_Base_Stop_IT(&htim6);
                                            
                                            EXTI->IMR |= 0x10;
                                            EXTI->EMR |= 0x10;
                                            TIM6->CNT = 0;
                                    }
                                    else
                                    {
                                            ucAcquCx = 0;
                                    }
                                    
                                    ucRecvBitBuff = 0;
                                    ucAcquCx = 0;
                            }
                            else
                            {
                                    TIM6->ARR = TimeSet[ucAcquCx];
                            }
                    }
                    break;

                    default:
                            break;
                    }
    }
}


沙发
qsrg51| | 2024-9-29 23:25 | 只看该作者
mod=space&uid=1841158]@description[/url]    : 模拟串口结构体初始化
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

3626

帖子

2

粉丝
12生肖为什么没有猫 黄芪配升麻有什么作用 vg是什么意思 nana是什么意思 维生素b6治什么病
善存片什么时候吃最好 孕妇吃什么是补铁的 mfr是什么意思 双胞胎代表什么生肖 左边小腹疼是什么原因
病毒性感染是什么原因 精子是什么味道的 什么叫室性早搏 抽血后头晕是什么原因 清朝什么时候灭亡的
室早是什么意思 肾结石炖什么汤喝最好 肝内钙化灶是什么意思 身正不怕影子斜是什么意思 af什么意思
被臭虫咬了擦什么药xianpinbao.com 十二月二十三是什么星座xinmaowt.com 月经前腰疼的厉害是什么原因hcv8jop2ns5r.cn 九头身什么意思96micro.com 什么人不能摆放大象hcv8jop0ns8r.cn
拔罐什么时候拔最好hcv7jop7ns1r.cn 缺钾挂什么科hcv8jop9ns5r.cn casio是什么牌子hcv8jop9ns6r.cn 蒋介石为什么不杀张学良hcv9jop2ns0r.cn 一般细菌培养及鉴定是检查什么hcv8jop1ns2r.cn
脑梗有什么特效药hcv7jop5ns2r.cn 12月21日什么星座hcv9jop4ns4r.cn 什么人不适合吃海参hcv8jop9ns0r.cn 屏气是什么意思hcv8jop5ns5r.cn 采什么hcv7jop9ns4r.cn
乳房结节吃什么药dajiketang.com 瓜田李下什么意思hcv8jop2ns9r.cn 什么的眉头hcv9jop5ns4r.cn 女性阴毛变白是什么原因hcv8jop2ns4r.cn 后果自负是什么意思hcv8jop2ns7r.cn
百度