找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2491|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32f1的Usart的應(yīng)用

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:113276 發(fā)表于 2016-4-10 14:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
測試背景:Device--Stm32f103vet6--Usart1;MDK5說明:在嵌入式方面,串口通信有著不可替代的優(yōu)勢,每當(dāng)我們?nèi)胧忠粔K新型的單片機(jī)時,往往會先學(xué)習(xí)”點燈大法(IO口)“,然后學(xué)習(xí)串口通信,毫不夸張的說,串口相當(dāng)于單片機(jī)的一雙眼睛,通過這雙眼睛,可以監(jiān)視單片機(jī)的運(yùn)行情況,及時發(fā)現(xiàn)問題,加快學(xué)習(xí)的速度。本篇文章以Stm32f103vet6的Usart1為例來舉例說明如何利用串口中斷與上位機(jī)進(jìn)行簡單通信,以為筆記。(后附程序)
主要有以下幾個步驟:
1、系統(tǒng)時鐘的配置:本文系統(tǒng)時鐘設(shè)置為72M,并開啟Usart1的時鐘;
2、IO口的配置:PA9h和PA10;
3、Usart的配置:本文波特率115200;
4、中斷優(yōu)先級的設(shè)置。
下為程序代碼:

//主函數(shù)文件
#include"stm32f10x_lib.h"

voidRCC_Configuration(void);
voidGPIO_Configuration(void);
voidUSART_Configuration(void);
voidNVIC_Configuration(void);

int main(void)
{
  
   RCC_Configuration();
  
   GPIO_Configuration();
  
   USART_Configuration();
  
NVIC_Configuration();
   while(1)
   {
      
   }
}

voidRCC_Configuration(void)
{
  
   ErrorStatus HSEStartUpStatus;
   
  
   RCC_DeInit();
  
   RCC_HSEConfig(RCC_HSE_ON);
  
   HSEStartUpStatus = RCC_WaitForHSEStartUp();
  
   if(HSEStartUpStatus == SUCCESS)
   {
   
   RCC_HCLKConfig(RCC_SYSCLK_Div1);
   
   RCC_PCLK2Config(RCC_HCLK_Div1);
   
   RCC_PCLK1Config(RCC_HCLK_Div2);
   
   FLASH_SetLatency(FLASH_Latency_2);
   
   FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
   
   RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
   
   RCC_PLLCmd(ENABLE);
   
   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) ==RESET);
   
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
   
   while(RCC_GetSYSCLKSource() != 0x08);
   }   
  
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_GPIOA, ENABLE);
}


voidGPIO_Configuration(void)
{
  
   GPIO_InitTypeDef GPIO_InitStructure;
   
  
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA , &GPIO_InitStructure);
   
  
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
   GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
   GPIO_Init(GPIOA , &GPIO_InitStructure);
}


voidUSART_Configuration(void)
{
  
   USART_InitTypeDef USART_InitStructure;
   
   USART_InitStructure.USART_BaudRate = 115200;
   USART_InitStructure.USART_WordLength =USART_WordLength_8b;
   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);
   
//使能USART1接收中斷
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //接收中斷使能
  
   USART_Cmd(USART1 , ENABLE);
}

voidNVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;

  
#ifdef  VECT_TAB_RAM
  
NVIC_SetVectorTable(NVIC_VectTab_RAM ,0x0);
#else
  
NVIC_SetVectorTable(NVIC_VectTab_FLASH , 0x0);  
#endif
  
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  
  
NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}


//中斷函數(shù)
voidUSART1_IRQHandler(void)
{

//接收中斷(接收寄存器非空)
if(USART1->SR & (1<<5))
{
USART_SendData(USART1 ,USART_ReceiveData(USART1));  //發(fā)送數(shù)據(jù)
}
}








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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表