附代码如下:
void TData(uint8_t *_usBuf, uint8_t _usLen) { uint8_t Tx_Status, Txread, Txwrite, Txcounter; uint16_t i; Txread =p_uart.Tx_read; Txcounter =p_uart.Tx_counter; //将待发送数据缓冲区写入UART发送数据缓冲区 for(i=0; i<_usLen;i++) { if(++Txread>= USART1_TX_BUF_SIZE) { Txread= 0; } if(++Txcounter>= USART1_TX_BUF_SIZE) //判断发送缓冲区数据个数 { Txcounter= 0; } p_uart.pTxBuf[p_uart.Tx_write]= _usBuf; if(++p_uart.Tx_write>= USART1_TX_BUF_SIZE) { p_uart.Tx_write= 0; } p_uart.Tx_counter++; } USART_ITConfig(USART1, USART_IT_TXE,ENABLE);
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) { USART_ClearITPendingBit(USART1,USART_IT_TXE); if(p_uart.Tx_read== p_uart.Tx_write) //没有新数据 { USART_ITConfig(USART1,USART_IT_TXE, DISABLE); USART_ITConfig(USART1,USART_IT_TC, ENABLE); } else { USART_SendData(USART1,p_uart.pTxBuf[p_uart.Tx_read]); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE == RESET)); if(++p_uart.Tx_read>= USART1_TX_BUF_SIZE) { p_uart.Tx_read = 0; } p_uart.Tx_counter--; }} else if(USART_GetITStatus(USART1, USART_IT_TC) !=RESET){ USART_ClearITPendingBit(USART1,USART_IT_TC); //清除发送完成标志位 if(p_uart.Tx_read == p_uart.Tx_write) //没有新数据 { USART_ITConfig(USART1, USART_IT_TC,DISABLE); //关闭发送完成中断 } else { USART_SendData(USART1,p_uart.pTxBuf[p_uart.Tx_read]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET); if(++p_uart.Tx_read>= USART1_TX_BUF_SIZE) { p_uart.Tx_read= 0; } p_uart.Tx_counter--; }}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我就是想实现最简单的利用串口USART1发送字符串功能,其它的不外乎就是一些GPIO、USART、NVIC的配置了吧。
不好意思,少些了一个“}”;
USART_ITConfig(USART1, USART_IT_TXE,ENABLE); 这句话之后的函数就是中断处理函数。
那你最好编辑了重新贴一下代码。。。使用帖代码的按钮。
[mw_shl_code=c,true]int main(void)
{
uint8_t *str;
while(1)
{
str = "Welcome to STM321111";
TData(str, 20);
}
}
[/mw_shl_code]
[mw_shl_code=c,true]void TData(uint8_t *_usBuf, uint8_t _usLen) //将数据存入缓冲区
{
uint8_t Tx_Status, Txread, Txwrite, Txcounter;
uint16_t i;
Txread = p_uart.Tx_read;
Txcounter = p_uart.Tx_counter;
//将待发送数据缓冲区写入UART发送数据缓冲区
for(i=0; i<_usLen; i++)
{
if(++Txread >= USART1_TX_BUF_SIZE)
{
Txread = 0;
}
if(++Txcounter >= USART1_TX_BUF_SIZE) //判断发送缓冲区数据个数
{
Txcounter = 0;
}
p_uart.pTxBuf[p_uart.Tx_write] = _usBuf;
if(++p_uart.Tx_write >= USART1_TX_BUF_SIZE)
{
p_uart.Tx_write = 0;
}
p_uart.Tx_counter++;
}
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
}
[/mw_shl_code]
[mw_shl_code=c,true]if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //发送寄存器空中断处理函数
{
USART_ClearITPendingBit(USART1, USART_IT_TXE);
if(p_uart.Tx_read == p_uart.Tx_write) //没有新数据
{
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
}
else
{
USART_SendData(USART1, p_uart.pTxBuf[p_uart.Tx_read]);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE == RESET));
if(++p_uart.Tx_read >= USART1_TX_BUF_SIZE)
{
p_uart.Tx_read = 0;
}
p_uart.Tx_counter--;
}
}
else if(USART_GetITStatus(USART1, USART_IT_TC) !=RESET) //发送完成中断处理函数
{
USART_ClearITPendingBit(USART1, USART_IT_TC); //清除发送完成标志位
if(p_uart.Tx_read == p_uart.Tx_write) //没有新数据
{
USART_ITConfig(USART1, USART_IT_TC, DISABLE); //关闭发送完成中断
}
else
{
USART_SendData(USART1, p_uart.pTxBuf[p_uart.Tx_read]);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
if(++p_uart.Tx_read >= USART1_TX_BUF_SIZE)
{
p_uart.Tx_read = 0;
}
p_uart.Tx_counter--;
}
}
[/mw_shl_code]
嗯,这样看着顺眼多了!
一周热门 更多>