OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4717|回复: 1

串口的发送完中断怎么发不出去数据?

[复制链接]

80

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2013-8-16
在线时间
37 小时
发表于 2015-5-11 14:59:54 | 显示全部楼层 |阅读模式
5金钱
大家好,我做了一个串口发送完中断的实验,可是怎么也发不出去数据,查找了好些资料也没弄明白是怎么回事,还请知道的大哥能指点指点,谢谢。下面是我的代码:
#define cli()  __set_PRIMASK(1)
#define sei()  __set_PRIMASK(0) 

int  reverse=1;
u8 TX_Counter=0;

void LED_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE); //使能PA,PD端口时钟

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->A.8 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);     //根据设定参数初始化GPIOA.8
  GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8 输出高

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;     //LED1-->D.2 端口配置, 推挽输出
  GPIO_Init(GPIOD, &GPIO_InitStructure);   //推挽输出 ,IO口速度为50MHz
  GPIO_SetBits(GPIOD,GPIO_Pin_2); //PD.2 输出高 
}

void time_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(  //使能或者失能指定的TIM中断
TIM3, //TIM2
TIM_IT_Update ,
ENABLE  //使能
);
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外设
}

void usart_init(u32 bound)
{
  //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
  USART_DeInit(USART1);  //复位串口1
//USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
   
    //USART1_RX  A.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10

   //Usart1 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

USART_InitStructure.USART_BaudRate = bound;//一般设置为115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式

    USART_Init(USART1, &USART_InitStructure); //初始化串口
    USART_ITConfig(USART1, USART_IT_TC, ENABLE);//开启中断
    USART_Cmd(USART1, ENABLE);                    //使能串口 
}

int main(void)
{
   SystemInit();//系统初始化
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
   delay_init();//延时函数初始化
   LED_Init();//led初始化
   time_init(19999,71);
   
   while(1)
   {
   }
}

void TIM3_IRQHandler(void)   //TIM3中断
{
 if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
    {
    TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
    sei();
reverse=reverse*(-1);
if(reverse==1)
{
 GPIO_SetBits(GPIOA,GPIO_Pin_8);
       GPIO_ResetBits(GPIOD,GPIO_Pin_2);
    } 
else if(reverse==(-1))
    {
 GPIO_ResetBits(GPIOA,GPIO_Pin_8);
     GPIO_SetBits(GPIOD,GPIO_Pin_2);
}
         usart_init(115200);
TX_Counter=0;

}
}

void USART1_IRQHandler(void)
{
   if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
   {
      USART_ClearITPendingBit(USART1,USART_IT_TC);
      sei();
 if(TX_Counter>4)
       {TX_Counter=4;}

 switch(TX_Counter)
       {
    case 0:
                USART1->DR=0x55;
TX_Counter++; 
break;
case 1:
                USART1->DR=0x56;
TX_Counter++; 
break;
case 2:
                USART1->DR=0x57;
TX_Counter++; 
break;
case 3:
                USART1->DR=0x58;
TX_Counter++; 
break;
case 4:
                while((USART1->SR&0x40)!=0x40); 
//USART_ITConfig(USART1, USART_IT_TC, DISABLE);//关闭发送完中断
TX_Counter++;
break; 
  }
   }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-12 00:21:42 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 15:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表