每次從串口除錯助手發送資料時,USART_DR資料暫存器寫不進去資料,始終為0。字串也是,主函式里面使用printf,程式就卡住。
uj5u.com熱心網友回復:
串口時鐘沒開?uj5u.com熱心網友回復:
串口時鐘沒開?通信腳沒有指定?另外,STM32和是否適用485沒有關系,485可以是TTL直接轉485,也可以是232轉485,485只是一個半雙工的中間層,從STM32看出去是透明的
uj5u.com熱心網友回復:
USART引數配置時,配置了串口時鐘、GPIO時鐘。應該不會是這個問題吧uj5u.com熱心網友回復:
下面是我從我的STM32F407IG程式中截取下來的USART1配置程式,你對照一下void USART1_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //for USART1 and USART6
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
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);
USART_Cmd(USART1, ENABLE);
//CPU的小缺陷:串口配置好,如果直接Send,則第1個位元組發送不出去如下陳述句解決第1個位元組無法正確發送出去的問題
USART_ClearFlag(USART1, USART_FLAG_TC); //清發送完成標志,Transmission Complete flag
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//////////////////////////////////////////////////////////////////
//// USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
//// 注意: 不要在此處打開發送中斷
//// 發送中斷使能在USART1_Begin_Send()函式打開
//////////////////////////////////////////////////////////////////
}
uj5u.com熱心網友回復:
我采用的是發送完成中斷發送字符,主程式中發送第1個字符,然后開啟發送完成中斷,然后在中斷服務程式中繼續發送其余字符void USART1_Begin_Send(void)
{
GPIO_USART1_RS485_SEND_enable();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
MB_USART1.sendPosi = 0;
USART_SendData(USART1, MB_USART1.send_buffer[MB_USART1.sendPosi++]);
}
uj5u.com熱心網友回復:
下面是中斷服務程式void USART1_IRQHandler(void)
{
uint8_t ch;
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
ch = USART_ReceiveData(USART1);
if (MB_USART1.receCount < MSCOMM_BUFFER_LENGTH)
MB_USART1.mscomm_buffer[MB_USART1.receCount++] = ch;
else
MB_USART1.receCount = 0;
}
else if (USART_GetITStatus(USART1, USART_IT_TC) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_TC);
if (MB_USART1.sendPosi < MB_USART1.sendCount)
USART_SendData(USART1, MB_USART1.send_buffer[MB_USART1.sendPosi++]);
else
{
GPIO_USART1_RS485_RECIVE_enable();
USART_ITConfig(USART1, USART_IT_TC, DISABLE);
}
}
}
uj5u.com熱心網友回復:
看看printf函式唄uj5u.com熱心網友回復:
就是,沒看見你用printf的程序和定義轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/32292.html
標籤:單片機/工控
上一篇:關于浮點加法演算法的細節探討
