久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5325|回復: 0
打印 上一主題 下一主題
收起左側

奮斗stm32開發板學習日記5—串口通信試驗

[復制鏈接]
跳轉到指定樓層
樓主
ID:85148 發表于 2015-7-9 01:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
                  準備材料:
  • Stm32f103開發板
  • Jlink調試器一個
  • 配套原理圖
相信無論哪本書都會將串口通信知識點放在書籍的最開始的前幾章,可見, 串口通信在單片機中的重要性,程序運行的時候,我們不但可以通過點亮led的方式,來調試程序。 同時也可以通過串口通信的方式來向串口調試助手中打印相關變量信息,顯示在計算機上, 但從這點上,串口通信的作用就可想而知了。
在串口通信中,我們要明白幾個參數, 字長(一次傳輸的數據長度), 波特率(每秒傳輸的數據位數), 奇偶校驗位, 還有停止位,這些參數都在ST的官方提供的串口庫中的USART_InitTypeDef的結構體中含有。
接下來我們還要介紹下串口的接口的標示圖,

從圖上可以看到,他一共有九個針口, 其中RX TX GND就是在串口通信中其主要作用。在多機串口通信中,要注意連線RX-TX,
TX-RX, GND-GND,
關鍵代碼如下:
  1. Int Main

  2. {

  3. uint8_t a=0;

  4. RCC_Configuration();    //初始化外設時鐘

  5. GPIO_Configuration();  // 初始化GPIO

  6. USART_Config(USART1);  // 初始化USART1

  7. NVIC_Configuration();    //配置中斷管理器

  8. while (1)

  9. {

  10. if(rec_f==1){

  11. rec_f=0;

  12. USART_OUT(USART1,"你發送的信息: \r\n");

  13. USART_OUT(USART1,&TxBuffer1[0]);

  14. if(a==0) {GPIO_SetBits(GPIOB, GPIO_Pin_5); a=1;}

  15. else {GPIO_ResetBits(GPIOB, GPIO_Pin_5);a=0; }

  16. }

  17. Return 0;

  18. }

  19. /****************************************************************************

  20. ****************************************************************************/

  21. void RCC_Configuration(void)

  22. {

  23. SystemInit();

  24. RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB

  25. | RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO , ENABLE);

  26. }

  27. ****************************************************************************/

  28. void GPIO_Configuration(void)

  29. {

  30. GPIO_InitTypeDef GPIO_InitStructrue;                                             //GPIO  初始化TX TX 對應的pin腳

  31. GPIO_InitStructrue.GPIO_Speed = GPIO_Speed_50MHz;

  32. GPIO_InitStructrue.GPIO_Pin = GPIO_Pin_9;

  33. GPIO_InitStructrue.GPIO_Mode = GPIO_Mode_AF_PP;

  34. GPIO_Init(GPIOA, &GPIO_InitStructrue);

  35. GPIO_InitStructrue.GPIO_Pin = GPIO_Pin_10;

  36. GPIO_InitStructrue.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  37. GPIO_Init(GPIOA, &GPIO_InitStructrue);

  38. }

  39. /****************************************************************************

  40. ****************************************************************************/

  41. void NVIC_Configuration(void)   //配置中斷管理器   優先級組, 搶占優先級, 相應優先級

  42. {

  43. NVIC_InitTypeDef NVIC_InitStructure;

  44. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  45. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

  46. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  47. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  48. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  49. NVIC_Init(&NVIC_InitStructure);

  50. }

  51. void USART_Config(USART_TypeDef* USARTx){      // 初始化串口1     波特率, 數組長度, 停止位,校驗位, 硬件控制流

  52. USART_InitTypeDef USART_InitStructrue;

  53. USART_InitStructrue.USART_BaudRate = 115200;

  54. USART_InitStructrue.USART_WordLength = USART_WordLength_8b;

  55. USART_InitStructrue.USART_StopBits = USART_StopBits_1;

  56. USART_InitStructrue.USART_Parity = USART_Parity_No;

  57. USART_InitStructrue.USART_HardwareFlowControl USART_HardwareFlowControl_None;

  58. USART_InitStructrue.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  59. USART_Init(USART1, &USART_InitStructrue);

  60. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);     //使能接收中斷

  61. USART_ITConfig(USART1, USART_IT_TXE, ENABLE);     //使能發送中斷

  62. USART_Cmd(USART1, ENABLE);

  63. }

  64. /**********************************************************************/

  65. void USART1_IRQHandler(void)

  66. {

  67. unsigned int i;

  68. if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)     //確定接收中斷

  69. {

  70. RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1);

  71. if(RxBuffer1[RxCounter1-2]==0x0d&&RxBuffer1[RxCounter1-1]==0x0a)

  72. {

  73. for(i=0; i< RxCounter1; i++) TxBuffer1[i]= RxBuffer1[i];

  74. rec_f=1;

  75. TxBuffer1[RxCounter1]=0;

  76. RxCounter1=0;

  77. }

  78. }

  79. if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)   //排除發送中斷

  80. {

  81. USART_ITConfig(USART1, USART_IT_TXE, DISABLE);

  82. }

  83. }
復制代碼



程序分析, 依舊是從main函數開始執行, RCC_Configuration初始化各個外設時鐘,具體是GPIOB與USART1這兩個外設。接著是具體配置GPIO口。 應為串口通信中,必須要用的兩根數據線TX RX 電路圖如圖:

從圖中可以看到,RX對應的PA9, TX對應的是PA10, 分別給這兩個Pin腳配置相關參數。程序繼續執行USART_config函數,該函數就是具體配置串口通信的相關參數了。 波特率,數據長度等等...
繼續執行NVIC_config函數,這里看到了一個陌生的結構體變量 NVIC_InitTypeDef,
簡單說的NVIC就是控制stm32所有的中斷的管理器。進入函數里面,設置中斷通道USART1_IRQn, 這里我們可以參考這張中斷向量表:

接下來本別分支搶占優先級,以及響應優先級。接下來,還要注意中斷函數USART1_IRQHandler, 進入該函數有兩種可能, 發送和接收到結束位,都有可能引發中斷,因此我們在進入中斷時候,要判斷下到到底是接收中斷,還是發送中斷。由于本實驗的目的只想讓接收數據產生中斷,故USART_ITConfig(USART1, USART_IT_TXE, DISABLE);就是關閉發送中斷。
最后來看下,產生中斷的原理,先看下串口架構圖:

數據在傳輸過程中,以發送為例, 內核首先把數據通過cpu或者dna(數據傳輸的一種方式) 寫入到發送數據的寄存器TDR中,接著,在適當時候把數據加載到發送移位寄存器中, 在發送到結束符時, 會讓圖中的TXE被置起,這時,就會引發一個中斷。
實驗現象:
串口助手打印出“ 你發送的信息為:xxxx ”


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 特黄色毛片 | 中文在线www | 欧美激情在线精品一区二区三区 | 欧美日一区二区 | 在线观看成人 | 国产色| av一区二区三区 | 99久久影院| 在线观看av网站 | 成人福利电影 | 亚洲三区视频 | 亚洲91| 日本视频在线播放 | 国内精品视频在线观看 | 羞羞在线视频 | 1000部精品久久久久久久久 | 日韩一区二区在线观看视频 | 91精品国产综合久久久久久蜜臀 | 欧美不卡 | 久久久久久国模大尺度人体 | 99视频免费在线观看 | 日韩av一区二区在线观看 | 国产高清在线精品一区二区三区 | 91久久精品一区二区二区 | 亚洲精品日日夜夜 | 久久久久国产一区二区三区四区 | 国产精品一区二区av | 特黄一级 | a在线免费观看 | 国产精品久久久久久二区 | 精品国产免费一区二区三区演员表 | 亚洲人a| 国产欧美日韩精品在线观看 | 国产精品毛片久久久久久久 | 激情的网站 | 成人性生交a做片 | 日韩欧美在线播放 | 国产区一区 | 亚洲精品视频一区二区三区 | 久久久国产一区二区 | 天堂va在线观看 |