<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                這是學習stm32的第四天了,怎么說呢?感觸最大的是,細心最重要,為什么呢?昨天,一個二進制到十六進制換算出來問題,導致一個問題糾結了一下午,今天,在初始化時鐘的時候,把9寫成10,導致,串口到下午才調試好。 好吧,現在開始說串口。 在我的板子上,USART1對應的PIN是 PA10 ---RX INPUT ?Mode:0x8 PA9---TX OUTPUT ?Mode:0xb 其實串口初始化也就分下面幾步: (1)PIN管腳時鐘使能,特殊功能寄存器使能,即GPIOA和USART1時鐘使能; (2)USART管腳配置,PA10配置成輸入模式:0x8;PA9配置成輸出模式;【前面講過怎么配置】 (3)USART Reset;記得關閉Reset; (4)USART 波特率設置; (5)USART寄存器配置; (6)USART中斷配置; 還是老規矩,先附上代碼: ~~~ /* USART0 PA10 --- RX INPUT M:0x8 PA9 --- TX OUTPUT M:0xb */ #define CPU_RATE_72M 72 int rs232_init(u32 cpu_rate,u32 baud) { float div; u16 div_int = 0; u16 div_float = 0; /* Get Div Baud */ div = (float)(cpu_rate*1000000)/(16*baud); div_int = div; div_float = 16*(div - div_int); div_int <<= 4; div_int += div_float; RCC->APB2ENR |= 1<<2; RCC->APB2ENR |= 1<<14; GPIOA->CRH &= ~(0xff<<4); //clear CRH at bit 10:9 GPIOA->CRH |= 0x8b << 4; //set CRH at bit 10:9 RCC->APB2RSTR |= 1<<14; //Reset USART0 RCC->APB2RSTR &= ~(1<<14);//Stop Reset USART0 /* config USART */ USART1->BRR = div_int; // Set Baud Rate USART1->CR1 &= ~(1<<12); // Set Data bit :8bit USART1->CR1 &= ~(1<<10); // CRC USART1->CR1 |= 1<<8; // Enable PE Interrupt USART1->CR1 |= 1<<5; // Enable RX Interrupt USART1->CR1 |= 3<<2; //Enable RX TX USART1->CR2 &= ~(3<<12); // Stop Bit :00 => 1SB USART1->CR1 |= 1<<13; // Enable USART init_interrupt(2,37,3,3); return 0; } ~~~ APB2ENR寄存器如下,我們要使能IOPA和USART1的時鐘所以,APB2ENR |= (1<<2) | (1<<14) ![](https://box.kancloud.cn/2016-06-21_576915b2036f7.jpg) APB2RSTR是外設復位寄存器:我們最好把USART1重新復位下,來確保系統的穩定性: ![](https://box.kancloud.cn/2016-06-21_576915b303705.jpg) 但是,在復位完成之后,一定要對該控制位置零,停止復位; APB2RSTR |= 1<<14; APB2RSTR&=~(1<<14); USART波特率的設置是整個配置中比較關鍵的,stm32廠商已經給了我們一個公式: ![](https://box.kancloud.cn/2016-06-21_576915b31b2db.jpg) USARTDIV計算出來,然后需要換算成USART_BRR寄存器需要的模式:我們呢可以先來研究下BRR寄存器: ![](https://box.kancloud.cn/2016-06-21_576915b333a9c.jpg) 他是把整數部分存放在4-15bit,小數部分存放在0~3bit 至于小數和整數部分的換算方法,STM也給提供了一個例子: ![](https://box.kancloud.cn/2016-06-21_576915b34e18a.jpg) 波特率計算完了,我們就需要對USART的控制寄存器進行設置,USART有三個控制器CR1,CR2,CR3 其中常用的只有CR1,CR2中只需配置一個參數。 關于這兩個寄存器的詳細信息請看25.6.4~26.6.7章,不過基本上看我的注釋就可以看懂; USART的中斷配置,跟昨天那個按鍵中斷配置一樣,他的中斷向量號是37 今天我重新把中斷配置函數進行了整理,大家可以拿去用: ~~~ void init_interrupt(u8 group,u8 inter_id,u8 preempting,u8 subpriority) { u32 aircr; u8 ip; /* Set Group :2 */ aircr = SCB->AIRCR; //Get AIRCR register aircr &= 0x0000f8ff; //Clear Password & PriGroup aircr |= 0x05fa0000; //Set Password aircr |= ((~group&0x7)<<8); //Set PriGroup Group:2 0000 0010 => 1111 1101 [5 = 0101b]<<8 SCB->AIRCR = aircr; //Set AIRCR /* * Group 2 2:2 * 0~3 : 0~3 * Set Preempting = 0 Subpriority = 0 * 1001 0000b = 0x00; */ if(inter_id<32) NVIC->ISER[0] = 1<< inter_id; else NVIC->ISER[1] = 1<<(inter_id-32); //EXIT15_10 vector:37 switch(group) { case 0: ip = 0x0f&subpriority;break; case 1: ip = (0x08&preempting) | (0x07&subpriority);break; case 2: ip = (0x0C&preempting) | (0x03&subpriority);break; case 3: ip = (0x0e&preempting) | (0x01&subpriority);break; case 4: ip = 0x0f&preempting;break; default: ip = 0x00;break; } NVIC->IP[inter_id] = 0xf0&(ip<<4); } ~~~ 他的發送和中斷接收函數也都很簡單,其中發送和接受標志位,在對數據進行寫,或者讀的時候他會自動清除 ~~~ int rs232_send_byte(u8 byte) { USART1->DR = byte; while(0 == (USART1->SR&(1<<6))); return 1; } void USART1_IRQHandler(void) { if(USART1->SR&(1<<5)) { rs232_send_byte(USART1->DR); } } ~~~ 有了串口,我們以后調試程序就更方便,我們可以直接把寄存器值讀出來,然后對初始化的寄存器值進行研究。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看