找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5225|回复: 3
打印 上一主题 下一主题
收起左侧

stm32f103 uart1 中断收发

[复制链接]
跳转到指定楼层
楼主
本代码亲测无误。
1.在PC串口工具发送给stm32 20字节的数据.
2.stm32收到20字节后,回发给PC串口工具,并闪灯。



主程序文件:
  1. /* MAIN.C file
  2. *
  3. * stm32-project
  4. */
  5. /***************************************************************
  6. / 深圳EU电子出品-版权所有-翻版必究
  7. / EU-热爱嵌入式开发
  8. ***************************************************************/
  9. //类型转换
  10. typedef unsigned char       bool;
  11. typedef unsigned char       u8;
  12. typedef unsigned short      u16;
  13. #define  True  1
  14. #define  False 0

  15. //SET BIT.    Example: a |= SETBIT0
  16. enum
  17. {
  18.         SETBIT0 = 0x0001,  SETBIT1 = 0x0002,        SETBIT2 = 0x0004,         SETBIT3 = 0x0008,
  19.         SETBIT4 = 0x0010,         SETBIT5 = 0x0020,        SETBIT6 = 0x0040,         SETBIT7 = 0x0080,
  20.         SETBIT8 = 0x0100,         SETBIT9 = 0x0200,        SETBIT10 = 0x0400, SETBIT11 = 0x0800,
  21.         SETBIT12 = 0x1000, SETBIT13 = 0x2000,        SETBIT14 = 0x4000, SETBIT15 = 0x8000               
  22. };
  23. //CLR BIT.    Example: a &= CLRBIT0
  24. enum
  25. {
  26.         CLRBIT0 = 0xFFFE,  CLRBIT1 = 0xFFFD,        CLRBIT2 = 0xFFFB,         CLRBIT3 = 0xFFF7,       
  27.         CLRBIT4 = 0xFFEF,         CLRBIT5 = 0xFFDF,        CLRBIT6 = 0xFFBF,         CLRBIT7 = 0xFF7F,
  28.         CLRBIT8 = 0xFEFF,         CLRBIT9 = 0xFDFF,        CLRBIT10 = 0xFBFF, CLRBIT11 = 0xF7FF,
  29.         CLRBIT12 = 0xEFFF, CLRBIT13 = 0xDFFF,        CLRBIT14 = 0xBFFF, CLRBIT15 = 0x7FFF
  30. };
  31. //CHOSE BIT.  Example: a = b&CHSBIT0
  32. enum
  33. {
  34.         CHSBIT0 = 0x0001,  CHSBIT1 = 0x0002,        CHSBIT2 = 0x0004,         CHSBIT3 = 0x0008,
  35.         CHSBIT4 = 0x0010,         CHSBIT5 = 0x0020,        CHSBIT6 = 0x0040,         CHSBIT7 = 0x0080,
  36.         CHSBIT8 = 0x0100,         CHSBIT9 = 0x0200,        CHSBIT10 = 0x0400, CHSBIT11 = 0x0800,
  37.         CHSBIT12 = 0x1000, CHSBIT13 = 0x2000,        CHSBIT14 = 0x4000, CHSBIT15 = 0x8000               
  38. };

  39. /* INCLUDES */
  40. //MCU
  41. #include "stm32f10x_rcc.h"
  42. #include "stm32f10x_gpio.h"
  43. #include "stm32f10x_tim.h"
  44. #include "util.h"
  45. #include "uart1.h"

  46. #include <stdio.h>
  47. #include <string.h>

  48. #if 0
  49. #ifdef __GNUC__
  50.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  51.      set to 'Yes') calls __io_putchar() */
  52.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  53. #else
  54.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  55. #endif /* __GNUC__ */

  56. PUTCHAR_PROTOTYPE
  57. {
  58.   /* Place your implementation of fputc here */
  59.   /* e.g. write a character to the USART */
  60.   USART_SendData(USART1, (uint8_t) ch);

  61.   /* Loop until the end of transmission */
  62.   while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  63.   {}

  64.   return ch;
  65. }
  66. #endif

  67. //设置PB10状态 STM32-MINI开发板的LED管脚
  68. void SetPB10(bool sta)
  69. {               
  70.                 static bool StartFlag = True;
  71.                 if(StartFlag)
  72.                 {
  73.                         GPIO_InitTypeDef GPIO_InitStructure;
  74.                         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  75.                         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
  76.                         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  77.                         GPIO_Init(GPIOB, &GPIO_InitStructure);
  78.                         StartFlag = False;
  79.                 }       
  80.                 if(!sta)       
  81.                         GPIO_SetBits(GPIOB, GPIO_Pin_10);       
  82.                 else
  83.                         GPIO_ResetBits(GPIOB, GPIO_Pin_10);       
  84. }

  85. //定时器配置并开启 使用定时器3
  86. void TimeON(void)
  87. {
  88.                 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  89.                 NVIC_InitTypeDef NVIC_InitStructure;
  90.                 //开启定时器外设时钟
  91.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  92.                 //配置定时器参数
  93.                 TIM_DeInit(TIM3);
  94.                 TIM_TimeBaseStructure.TIM_Period = 10000;                                                                          //10ms定时                         
  95.                 TIM_TimeBaseStructure.TIM_Prescaler = (72000000/1000000 - 1);              
  96.                 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     
  97.                 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  98.                 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  99.                 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);       
  100.                 //中断配置
  101.                 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  102.                 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //抢占优先级2 低优先级别中断
  103.                 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                           //响应优先级0 高级别的响应中断
  104.                 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       
  105.                 NVIC_Init(&NVIC_InitStructure);          
  106.                 //开中断
  107.                 TIM_ClearFlag(TIM3, TIM_FLAG_Update);                                          
  108.                 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
  109.                 //开启定时器                         
  110.                 TIM_Cmd(TIM3, ENABLE);
  111. }

  112. u32 led_time = 240;
  113. //定时器中断处理 从stm32f10x_it.c添加
  114. void Time_IntHandle(void)
  115. {
  116.                 //清中断标识
  117.                 TIM_ClearFlag(TIM3, TIM_FLAG_Update);
  118.                 //---------------- 中断处理  ---------------------
  119.                 {
  120.                                 static u8 Num = 0;
  121.                                 if(++Num == led_time)        //zlz modify 30->240
  122.                                 {
  123.                                                 //----------- 0.3s事务 闪烁LED -----------
  124.                                                 static bool Temp = False;
  125.                                                 Temp = !Temp;
  126.                                                 ledon = !ledon;
  127.                                                 //SetPB10(Temp);
  128.                                                 //--------------------------------------
  129.                                                 Num = 0;
  130.                                                 //USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
  131.                                 }
  132.                 }
  133. }

  134. /*-------------------------------------------------------------------------------------------------------
  135. *  程序从这里执行                       
  136. *  本程序通过定时器 闪烁STM32-MINI开发板LED 请保持LS1跳线帽处于连接状态
  137. -------------------------------------------------------------------------------------------------------*/
  138. int main(void)
  139. {
  140.                 u32 test;
  141.                 u8 RxCounter, TxCounter, i;
  142.                 u8 RxBuffer[32], TxBuffer[32];
  143.                 //--------------------------- CLK INIT, HSE PLL ----------------------------
  144.                 ErrorStatus HSEStartUpStatus;
  145.                 //RCC reset
  146.                 RCC_DeInit();
  147.                 //开启外部时钟 并执行初始化
  148.                 RCC_HSEConfig(RCC_HSE_ON);
  149.                 //等待外部时钟准备好
  150.                 HSEStartUpStatus = RCC_WaitForHSEStartUp();
  151.                 //启动失败 在这里等待
  152.                 while(HSEStartUpStatus == ERROR);
  153.                 //设置内部总线时钟
  154.                 RCC_HCLKConfig(RCC_SYSCLK_Div1);
  155.                 RCC_PCLK1Config(RCC_HCLK_Div1);
  156.                 RCC_PCLK2Config(RCC_HCLK_Div1);
  157.                 //外部时钟为8M 这里倍频到72M
  158.                 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
  159.                 RCC_PLLCmd(ENABLE);
  160.                 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
  161.                 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  162.                 while(RCC_GetSYSCLKSource() != 0x08);

  163.                 //----------------------------- CLOSE HSI ---------------------------
  164.                 //关闭内部时钟HSI
  165.                 RCC_HSICmd(DISABLE);       
  166.                
  167.                 //开PB口时钟
  168.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  169.                        
  170.                 //中断配置 2-level interrupt
  171.                 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  172.                
  173.                 //开总中断
  174.                 __enable_irq();
  175.                
  176.                 //开定时器
  177.                 TimeON();
  178.                
  179.                 for(i=0; i<UART1_N_TX; ++i)
  180.                 {
  181.                         //TxBuffer1[i] = 0x18 + i;
  182.                 }
  183.                 Uart1_Cfg();
  184.                
  185.                 ledon = 1;
  186.                
  187.                 //printf("line %d, %s\n", __LINE__, __func__);
  188.                 //等待中断
  189.                 while(1)
  190.                 {
  191.                         if( rx4pc1 )
  192.                         {
  193.                                         rx4pc1 = 0;
  194.                                         memcpy(TxBuffer1, RxBuffer1, UART1_N_RX);
  195.                                         USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
  196.                                
  197.                                         if( (RxBuffer1[18] == 0x55) && (RxBuffer1[19] == 0x1a) )
  198.                                         {
  199.                                                 SetPB10(1);
  200.                                         }
  201.                                         else if( (RxBuffer1[0] == 0x56) && (RxBuffer1[1] == 0x1a) )
  202.                                         {
  203.                                                 SetPB10(0);
  204.                                         }
  205.                                         memset(RxBuffer1, 0, sizeof(RxBuffer1));
  206.                         }
  207.                
  208.                         //SetPB10(ledon);
  209.                 }
  210. }



复制代码


uart1_irq_rxtx_04231904.rar

1.41 MB, 下载次数: 32, 下载积分: 黑币 -5

stm32f103 uart1 中断收发

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:118784 发表于 2016-5-6 10:51 | 只看该作者
不错,学习了
回复

使用道具 举报

板凳
ID:129602 发表于 2016-7-14 11:20 | 只看该作者
正在看串口,学习了
回复

使用道具 举报

地板
ID:36783 发表于 2016-7-22 20:59 | 只看该作者
学习了。 谢谢楼主分享!
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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