首页 > 其他分享 >STM32系列--串口收发+基本定时器

STM32系列--串口收发+基本定时器

时间:2024-06-03 17:45:25浏览次数:21  
标签:NVIC u8 TIM4 -- USART STM32 TIM 串口 myusart

 

 

        if(myusart.reflag>0)
        {                    
            Com_Handle();        
            myusart.recount=0;   
            myusart.reflag=0;                
        }
main

 

#define _maxbuf 100

typedef struct
{
 u8 myadd;
 u8 rcbuf[_maxbuf];
 u16 timout;
 u8 recount;
 u8 timrun;
 u8  reflag;
 u8 Sendbuf[_maxbuf]; /
 u8 flag;
}MYUSART;
extern MYUSART myusart;
MYUSART

 

YUSART myusart;

u16 tdat=0;
u16 tflag=0;

void TIME4_Init(u16 arr,u16 psc)
{
 
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能

    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值     计数到5000为500ms
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
    TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    TIM_ITConfig(  //使能或者失能指定的TIM中断
        TIM4, //TIM2
        TIM_IT_Update ,
        ENABLE  //使能
        );
    NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
    TIM_Cmd(TIM4, ENABLE);  //使能TIMx外设
}

void TIM4_IRQHandler(void)   //TIM3中断 1MS
{
    u8 st;
    if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
    {      
        st= TIM_GetFlagStatus(TIM4, TIM_FLAG_Update);    
        if(st==SET)
        {
          TIM_ClearFlag(TIM4, TIM_FLAG_Update);
            
            tdat++;
            
            if(!(tdat&0x0F)) //16MS
            {
                tflag |= _bit(1);
            }
            
            if(myusart.timout>0)
            {
                if(--myusart.timout==0)
                {
                    myusart.reflag=1;  //收到一帧数据
                }
            }            
        }    
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
    }
}
time4
void USART1_IRQHandler(void)                    //串口1中断服务程序
    {
     u8 sbuf;
#ifdef OS_TICKS_PER_SEC         //如果时钟节拍数定义了,说明要使用ucosII了.
    OSIntEnter();    
#endif
        if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)//注意!不能使用if(USART_GetITStatus(USART1, USART_IT_RXNE) != sbufET)来判断  
        {  
                sbuf=USART_ReceiveData(USART1);  
        } 
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0xbb 结尾)
    {
        sbuf =USART_ReceiveData(USART1);//(USART1->DR);    //读取接收到的数据
        
        if( myusart.reflag==0)
        {
            myusart.timout=10;
            if(myusart.recount<_maxbuf) 
            {
                myusart.rcbuf[myusart.recount++]=sbuf;
            }
        }

        
#if 0    
        if( myusart.reflag==1)  //有数据包正在处理
        {
            return ;
        }             
        myusart.rcbuf[myusart.recount++]=sbuf;
        myusart.timout=0;  
        if(myusart.recount==1)  //收到主机发来的一帧数据的第一字节
        {
            myusart.timrun=1;  //启动定时
        }
#endif
        
        USART_ClearITPendingBit(USART1,USART_IT_RXNE);            
        
    } 
USART1_IRQHandler

 

标签:NVIC,u8,TIM4,--,USART,STM32,TIM,串口,myusart
From: https://www.cnblogs.com/zhouyuqing1024/p/18229215

相关文章

  • Oracle获取吞吐量和IOPS的脚本
     Oracle获取吞吐量和IOPS的脚本 数据底层存储要换盘,对新盘做IOPS压测。并花了点时间写了脚本获取数据库每秒的吞吐量和IOPS信息。可以将数据导成excel并绘制为折线图等统计图。  --获取IOPS(当前实例)selectto_char(t.begin_interval_time,'yyyy-mm-ddhh24:mi')......
  • ysyx:对数学表达式的理解
    数学表达式的递归分解顺序和日常的顺序是完全相反的。一方面,原本的高级运算符要后进行拆分,另一方面,原本的从左到右的运算顺序使得拆分运算符时要从最右侧进行拆分。要解析一个带有括号的长表达式并没有想象中那么容易我对括号处理的理解有问题,识别括号时,不是两侧有括号+括号匹配......
  • 实现流程化办公,可以相信拖拽表单设计器!
    当前,竞争压力越来越大,利用什么样优良的办公软件实现流程化办公?可以一起来了解低代码技术平台、拖拽表单设计器的优势特点,看看它们是如何助力企业降本、增效、提质的。低代码技术平台的优势特点多,可以助力企业用拖拽式搭积木的方式实现各种应用场景的定制,因此,深得大家的喜爱与支持......
  • 关于vue关闭页面时去除定时器失效问题解决
    1.先去除页面缓存,这个在路由部分 2.    ......
  • 瀑布流练习
    瀑布流练习题0.瀑布流的形成各种高度不同的方块平铺。需要注意的是,第二行开始,选高度最小的方块位置插入新的方块,即需要记住当前高度数组。1.父组件瀑布流的容器这里的number是为了验证是否如开头所言,插入选取位置最矮的<template><WaterFall:list="list"></WaterFall>......
  • FastAdmin 后端控制器与前端页面传参
    1.菜单让链接带参 2.控制器传参数到前端JS$this->assignconfig('tab',$tab); 3.JS传参回后端index_url:'contract/contract/index/tab/'+Config.tab, ......
  • 【微信小程序】bug解决:van-tab+ucharts多图显示问题
    这是一条价值30r的博客......
  • 结合Sanp的调试
           发生错误:g++-Wall-Wextra-O3-DNDEBUG-I../build-ocadicalcadical.o-L.-lcadical/usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld:./libcadical.a(restart.o):restart.cpp:(.text+0xb9e):undefinedreference......
  • redis - [02] 安装部署
    在Windows和Linux操作系统下的安装部署  一、windows版(1)访问redis下载地址:https://github.com/tporadowski/redis/releases(2)将Redis-x64-5.0.14.1.zip下载并解压到合适的目录(3)打开cmd窗口,切换到该目录下运行:redis-server.exeredis.windows.conf运行之后,redis服务就......
  • pip更换源
    由于pip默认使用Python的官方源pypi.python.org/pypi,导致我们经常使用pip装包时速度过慢或者无法安装(请求超时)等问题,所以国内用户建议使用pip国内源。目前常用的pip国内源有:豆瓣:http://pypi.douban.com/simple/(推荐)清华:http://pypi.tuna.tsinghua.edu.cn/simple提示:Pytho......