[/code]小弟參照了正點原子的教程撰寫了串口USART接收中斷函式,但是為什么無法實作上位機發送,接收中斷,發送回上上位機,各位老哥大神幫幫小弟看看這代碼。
void my_usart1_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//使能GPIO時鐘,Usart時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
//初始化PA10 TXD
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復用輸出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; //10
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;//速度10Mhz
GPIO_Init( GPIOA, &GPIO_InitStructure);
//初始化PA9 RXD
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空輸入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; //9
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;//速度10Mhz
GPIO_Init( GPIOA, &GPIO_InitStructure);
//復位串口配置
USART_DeInit( USART1);
//串口初始化
USART_InitStructure.USART_BaudRate =115200; //波特率
USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None; //沒有硬體控制流
USART_InitStructure.USART_Mode =USART_Mode_Rx|USART_Mode_Tx;//接收發送模式
USART_InitStructure.USART_Parity =USART_Parity_No; //沒有基偶校驗位
USART_InitStructure.USART_StopBits =USART_StopBits_1; //1個停止位
USART_InitStructure.USART_WordLength =USART_WordLength_8b; //資料8個字長
USART_Init(USART1, &USART_InitStructure);
//使能串口
USART_Cmd(USART1,ENABLE);
/*******************以串口作為中斷源初始化化串口中斷**************************/
//設定串口接收中斷
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//中斷優先級分組
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//設定中斷優先級初始化
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口位中斷通道
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0x00; //設定搶占優先級
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0x00; //設定相應優先級
NVIC_Init(&NVIC_InitStructure);
}
/*撰寫中斷服務函式*/
/******************************
*@1、當單片機接收到資料,則產生中斷
*@2、向量中斷控制器進行中斷管理分配回應優先級和搶占優先級
*@3、進入中斷服務函式。
******************************/
void USART1_IRQHandler (void)
{
uint8_t shuju;
if( USART_GetITStatus(USART1, USART_IT_RXNE)==SET) //讀數暫存器非空,RXNE位置1,MCU可以讀取資料。
{
shuju=USART_ReceiveData(USART1); //把資料賦值給變數date
}
USART_SendData( USART1, shuju);
}
//******************主函式**************//
int main(void)
{
led_Init();
delay_init();
my_usart1_Init();
while(1)
{
led0(off);
led1(on);
delay_ms(100);
led0(on);
led1(off);
delay_ms(100);
}
}
上位機界面

小弟在此恭候大神解答。感激不盡死而后已。
uj5u.com熱心網友回復:
https://blog.csdn.net/u014694105/article/details/105215091看博客,直接復制粘貼里面的代碼即可實作串口發送接收uj5u.com熱心網友回復:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);可能是少了這一句,你串口助手每次只發一個位元組應該沒問題,你發一個字串可能就會出問題了吧,你為什么要在接收中斷里面發送資料,中斷里面不允許做一些耗時長的操作, 多看看原子是怎么處理接受函式的吧,加油。uj5u.com熱心網友回復:
原來我是引腳初始化錯了,他這個是不需要使能AFIO時鐘的uj5u.com熱心網友回復:
原來我是引腳初始化錯了,他這個是不需要使能AFIO時鐘的uj5u.com熱心網友回復:
粗略看了下,可能是因為進入接收中斷時沒有把狀態位清0if( USART_GetITStatus(USART1, USART_IT_RXNE)==SET) //讀數暫存器非空,RXNE位置1,MCU可以讀取資料。
{
USART_ClearFlag(USART1,USART_IT_RXNE);
shuju=USART_ReceiveData(USART1); //把資料賦值給變數date
USART_SendData( USART1, shuju);
}
這樣試試看
uj5u.com熱心網友回復:
我原來是初始化引腳出錯了。uj5u.com熱心網友回復:
我原來是初始化引腳出錯了。
uj5u.com熱心網友回復:
學習中不能復制吧
uj5u.com熱心網友回復:
9才是tx吧,10是rx
看了好一會才發現其他應該沒什么問題
uj5u.com熱心網友回復:
是的
,真是馬大哈
uj5u.com熱心網友回復:
是的
,真是馬大哈
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/39128.html
標籤:單片機/工控
上一篇:21年畢業的電子工程師前景如何?
