首页 > 其他分享 >sumulation_Uart_Send_Data

sumulation_Uart_Send_Data

时间:2024-04-11 15:00:26浏览次数:12  
标签:TIM2 TIM3 Uart sumulation NVIC TIM TimeBaseStructure InitStructure Data

void sumulation_Uart_Send_Data(void)
{
uint8_t i = 0,j;
uint8_t temp = 0;

OUTPUT_LOW_LEVEL();
delay_us(1500);
for(i=0;i<4;i++) //四个字节
{
temp = myusart.rcbuf[i];
for (j=0;j<8;j++)
{
PA12_OUT ^= 1; //异或就是取反;
if (temp&0x80) //先发送第七位
{
delay_us(750);
}else
{
delay_us(250);
}
temp<<=1;
}
//simulation_Uart_Send_Byte(temp);
}
OUTPUT_HIGH_LEVEL(); //空闲信号
}

#include "timer.h"
#include "led.h"
#include "usart.h"
#include "com.h"    
void TIM3_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, 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(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

    NVIC_InitStructure.NVIC_IRQChannel = TIM3_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(TIM3, ENABLE);  //使能TIMx外设
                             
}
//定时器2中断服务程序
u8 time_i=0;
void TIM3_IRQHandler(void)   //TIM3中断  50us
{
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
        {
            time_i++;
            if(time_i>=20) //1ms
            {
                time_i=0;
                if(myusart.timout>0)
                {
                    if(--myusart.timout==0)
                    {
                        myusart.reflag=1; //收到一帧数据
                    }
                }    
      }
                
            TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源     
        }
}

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

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, 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(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM2中断,允许更新中断

    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中断
    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(TIM2, ENABLE);  //使能TIMx外设
                             
}

//定时器2中断服务程序
#define PA0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
u8 TIM2_i=0;
u32 TIM2_a,TIM2_b;
u8 TIM2_c[10];
u8 TIM2_flag=0;
u8 TIM2_dat;

void TIM2_sendback(void)
{
      unsigned char t;
    
        for(t=0;t<4;t++)
        {
            USART_SendData(USART1, TIM2_c[t]);//向串口1发送数据
            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
        }    
    
}



#define R250 7
#define L250 3
#define R750 20
#define L750 10
#define R1500 35
#define L1500 25
#define H2500 50


void checkIO(u32 x)
{
    if(x>0)
    {
        if(TIM2_flag&1)
        {
            TIM2_c[TIM2_i]<<=1;
            if ((x>L250)&&(x<R250) )
                TIM2_c[TIM2_i]&=~0x01;
            else 
            if ((x>L750)&&(x<R750) )
                TIM2_c[TIM2_i]|=0x01;
            else
                TIM2_flag = 0;
            if(++TIM2_dat>=8) 
            {
                TIM2_dat = 0;
                TIM2_i++;
            }
        }
    }
}

void TIM2_IRQHandler(void)   //TIM2中断  60us
{
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
        {
            if(PA0==0)
            {
                checkIO(TIM2_b);
                TIM2_a++;
                TIM2_b = 0;
      }else
            {
                checkIO(TIM2_a);
                if ((TIM2_a>L1500)&&(TIM2_a<R1500) )
                {
                    TIM2_flag |= 1;
                    TIM2_i = 0;
                    TIM2_dat = 0;
                }
                if ((TIM2_b>H2500)&&(TIM2_flag&1)) //OK
                {
                    //串口发生数据
                    TIM2_flag = 0;
                    TIM2_sendback();
                }
                TIM2_a = 0;
                TIM2_b++;
      }
            TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源     
        }
}
View Code

 

标签:TIM2,TIM3,Uart,sumulation,NVIC,TIM,TimeBaseStructure,InitStructure,Data
From: https://www.cnblogs.com/zhouyuqing1024/p/18129220

相关文章

  • PWM、通信、串口通信、UART、TTL、51单片机串口通信、定时器初值的计算公式
    我要成为嵌入式高手之4月8日51单片机第三天!!————————————————————————————PWM        脉冲宽度调制(PWM),是英文“PulseWidthModulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应......
  • c# 实现Quartz任务调度
    使用Quartz.NET,你可以很容易地安排任务在应用程序启动时运行,或者每天、每周、每月的特定时间运行,甚至可以基于更复杂的调度规则。官网:http://www.quartz-scheduler.net/实现任务类创建一个实现了IJob接口的类(MailJobTest),该接口包含一个Execute方法,该方法将在作业运行时......
  • hadoop篇——nameNode DataNode SecondaryNameNode的作用,以及如何查看操作日志
    集群下的hadoop(112主节点113,114从节点)如果112挂了,数据以及操作日志会丢失无法恢复,又称单点故障。再启动start-all.shhadoop后,主节点会产生name以及secondary两个文件 所在地址在  /root/training/hadoop-2.7.3/tmp/dfs其中name对应的是NameNode节点:接受客户端的请......
  • GD32F470II的UART+DMA方式的使用笔记
    GD32官方给的DEMO真的是屎一样的存在,仅展示最基本简单的应用案例,拿到实际工程中参考性非常低,也就基本的配置过程具有有限的参考性。在这种环境下,使用UART+DMA的方式完全是瞎用,感觉能用的函数都给用上。UART&DMA配置如下:1/*!2\briefconfigureUSARTDMA3......
  • 大会预告|乘云数字 Databuff 邀请您参加「第二届 eBPF 开发者大会」
    冬去春来,草长莺飞,「第二届 eBPF开发者大会」即将到来。本次大会将于 2024年4月13 日,在陕西省西安市线下举办,由西安邮电大学主办,在西安邮电大学(东区)逸夫教学楼召开。会议介绍大会以「发挥eBPF 技术力量,提升计算机系统可观测性和性能」为主题,议题涵盖eBPF技术及发展......
  • Datacom HCIP笔记-MPLS协议 之二
    在Ingress节点执行该命令时,触发所有的32位路由建立LDPLSP。在Egress节点执行该命令时,触发本地32位路由建立LDPLSP,egress就是主机路由始发路由器ingress就是主机路由非始发路由器默认情况下:华为路由器仅为非物理接口主机路由产生LSP,即为/32掩码长度loopback口路由产生LSP......
  • OO ALV 强制触发 data_change事件
    参考博客https://community.sap.com/t5/application-development-blog-posts/trigger-alv-data-change-event-manual/ba-p/13003658https://blog.csdn.net/qq_40977705/article/details/104599677https://blog.csdn.net/qq_40977705/article/details/108880331data_change写l......
  • 你真会判断DataGuard的延迟吗?
    这是一个比较细节的知识点,但必须要理解这个才能准确判断OracleADG的延迟情况。以前做运维工作时,记得是要同时重点关注v$dataguard_stats视图中的几个字段的值,分别是:NAME、VALUE、TIME_COMPUTED、DATUM_TIME。本文先不考虑v$dataguard_stats视图没有数值显示的特殊情况,只针对当v......
  • CMD 批处理脚本自定义 UEFI 启动项,您需要使用 bcdedit 命令来操作 Windows 引导管理器
    CMD批处理脚本自定义UEFI启动项,您需要使用bcdedit命令来操作Windows引导管理器(BootConfigurationData,BCD)。BCD存储了计算机启动时所需的信息,包括可用的操作系统和启动选项。以下是一个简单的示例,演示如何使用CMD批处理脚本添加、修改和删除启动项:1.添加启动项要添......
  • 解决hadoop的namenode和datanode结点启动不起来的问题
    首先介绍一下本人的情况:我的虚拟机最开始是可以启动的,后来删除了主节点,重新创建了一个主节点,并保持相同的主机名,并把从结点上的hadoop打包发到了主节点(前提已经弄好ssh和相关映射)tar-zcf~/hadoop.master.tar.gz./hadoop//将hadoop目录下的内容打包复制到~/hadoop.master.ta......