OpenEdv-开源电子网

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

串口发送中断和发送完中断?

[复制链接]

80

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2013-8-16
在线时间
37 小时
发表于 2015-6-3 14:03:21 | 显示全部楼层 |阅读模式
5金钱
大家好,我写了一个发送中断和发送完中断的一个测试程序,可是发送中断发送数据还可以实现,可是使用发送完中断来发送数据就不能实现了。下面是我的代码,大家帮忙看看,问题出在什么地方,我做了很多次尝试都没有成功,还请知道的大神们指点一二,谢谢。
//==============================================================
void NVIC_Configuration(void)
{
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
}

void usart_init(u32 bound)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//使能USART2时钟
  USART_DeInit(USART2);//复位串口2
  //USART1_TX   PA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //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_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10
  //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(USART2, &USART_InitStructure); //初始化串口
  USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);//关闭中断
  USART_ITConfig(USART2, USART_IT_TC, ENABLE);//关闭中断
  USART_Cmd(USART2, ENABLE);                //使能串口 
}

int main(void)
{

   GPIO_InitTypeDef GPIO_InitStructure;

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);

   NVIC_Configuration();// 设置中断优先级分组

   delay_init();

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; 
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
   GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化A8

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; 
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
   GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化A8

   GPIO_SetBits(GPIOA,GPIO_Pin_8);
   GPIO_SetBits(GPIOD,GPIO_Pin_2);
   //=============================================================串口初始化
   usart_init(115200);
   while(1)
   {
USART2->DR=0x05; //触发中断
TX_Counter=0;
   }
}

void USART2_IRQHandler(void)
{
  if(USART_GetITStatus(USART2, USART_IT_TC) != RESET)
{
      
 sei(); //开启所有中断
      if(TX_Counter>4)
       {TX_Counter=4;}
  switch(TX_Counter)
       {
   case 0:
                USART2->DR=0x55;
TX_Counter++; 
break;    
        case 1:
USART2->DR=0x56;
TX_Counter++;
break;
        case 2: 
USART2->DR=0x57;
TX_Counter++;           
                break;
        case 3:
USART2->DR=0x58;
TX_Counter++;
                break;
   case 4:
                while((USART2->SR&0x40)!=0x40); 
TX_Counter++;
break; 
  }
}  
}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2015-12-28 12:34:07 | 显示全部楼层
我有故事,你有酒吗
回复

使用道具 举报

10

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2016-1-21
在线时间
30 小时
发表于 2016-1-22 15:04:47 | 显示全部楼层
sei();这函数能用吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 13:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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