|
本帖最后由 lihaimeng@163 于 2017-9-12 16:19 编辑
大家好!帮忙看看。
现象 :
调试STM8L052 的时候碰到一个奇怪的现象,就是DMA发送的时候会丢字节!且不是尾巴和头部而是中间的几个字节丢了。且是随机的丢部分。
实用串口DMA接收,IDLE中断读取不定长的数据,然后串口DMA发送数据。
代码:
#define EW_USART USART2
#define EW_USART_CLK CLK_Peripheral_USART2
#define EW_USART_TX_PORT GPIOE
#define EW_USART_TX_PIN GPIO_Pin_3
#define EW_USART_RX_PORT GPIOE
#define EW_USART_RX_PIN GPIO_Pin_4
/*data reg address*/
#define USART_DR_ADDRESS (uint16_t)((uint32_t)EW_USART+1) /* USART1 Data register Address */
#define USART_DMA_CHANNEL_RX DMA1_Channel3
#define USART_DMA_RX_TC_FLAG DMA1_FLAG_TC3
#define USART_DMA_RX_HT_FLAG DMA1_FLAG_HT3
#define USART_DMA_CHANNEL_TX DMA1_Channel0
#define USART_DMA_TX_TC_FLAG DMA1_FLAG_TC0
#define USART_DMA_TX_HT_FLAG DMA1_FLAG_HT0
void ewPort_usart_init(uint8_t *txBuffer,uint8_t txBufferSize,
uint8_t *rxBuffer,uint8_t rxBufferSize){
/*9600*/
/* Enable USART clock */
CLK_PeripheralClockConfig((CLK_Peripheral_TypeDef)EW_USART_CLK, ENABLE);
/* Configure USART Tx as alternate function push-pull (software pull up)*/
GPIO_ExternalPullUpConfig(EW_USART_TX_PORT, EW_USART_TX_PIN, ENABLE);
/* Configure USART Rx as alternate function push-pull (software pull up)*/
GPIO_ExternalPullUpConfig(EW_USART_RX_PORT, EW_USART_RX_PIN, ENABLE);
GPIO_Init(EW_USART_TX_PORT, EW_USART_TX_PIN, GPIO_Mode_Out_PP_High_Fast);
/* USART configuration */
USART_Init(EW_USART, 9600,
USART_WordLength_8b,
USART_StopBits_1,
USART_Parity_No,
(USART_Mode_TypeDef)(USART_Mode_Rx|USART_Mode_Tx));
/*DMA config*/
/* Enable DMA1 clock */
CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);
DMA_GlobalDeInit();
DMA_DeInit(USART_DMA_CHANNEL_RX);
DMA_DeInit(USART_DMA_CHANNEL_TX);
/* DMA channel Rx of USART Configuration */
DMA_Init(USART_DMA_CHANNEL_RX, (uint32_t )rxBuffer, USART_DR_ADDRESS,
rxBufferSize, /* DMA_BufferSize */
DMA_DIR_PeripheralToMemory, DMA_Mode_Circular, DMA_MemoryIncMode_Inc,
DMA_Priority_Low, DMA_MemoryDataSize_Byte );
/* DMA channel Tx of USART Configuration */
DMA_Init(USART_DMA_CHANNEL_TX, (uint32_t)txBuffer, USART_DR_ADDRESS,
txBufferSize, DMA_DIR_MemoryToPeripheral, DMA_Mode_Normal,
DMA_MemoryIncMode_Inc, DMA_Priority_High, DMA_MemoryDataSize_Byte);
/* Enable the USART Tx/Rx DMA requests */
USART_DMACmd(EW_USART, USART_DMAReq_TX, ENABLE);
USART_DMACmd(EW_USART, USART_DMAReq_RX, ENABLE);
DMA_Cmd(USART_DMA_CHANNEL_RX, ENABLE);
DMA_GlobalCmd(ENABLE);
/*receive idle interrupt config*/
USART_ITConfig(EW_USART, USART_IT_IDLE, ENABLE);
USART_Cmd(EW_USART, ENABLE);
}
void ewPort_usart_dma_send_block(uint8_t *ptBuffer,uint8_t size){
DMA_Cmd(USART_DMA_CHANNEL_TX, DISABLE);
DMA_ClearFlag(USART_DMA_TX_TC_FLAG);
DMA_ClearFlag(USART_DMA_TX_HT_FLAG);
DMA_SetCurrDataCounter(USART_DMA_CHANNEL_TX, size);
DMA_ITConfig(USART_DMA_CHANNEL_TX, DMA_ITx_TC, ENABLE);//使能TC中断
DMA_Cmd(USART_DMA_CHANNEL_TX, ENABLE);
}
uint16_t ewPort_usart_dma_received_size(void){
uint16_t dataSize = 0;
DMA_Cmd(USART_DMA_CHANNEL_RX, DISABLE);
dataSize = DMA_GetCurrDataCounter(USART_DMA_CHANNEL_RX);
return dataSize;
}
void ewPort_usart_dma_receive_start(uint8_t *ptBuffer,uint8_t size){
DMA_ClearFlag(USART_DMA_RX_TC_FLAG);
DMA_ClearFlag(USART_DMA_RX_HT_FLAG);
DMA_SetCurrDataCounter(USART_DMA_CHANNEL_RX, size);
DMA_Cmd(USART_DMA_CHANNEL_RX, ENABLE);
}
/*isr*/
INTERRUPT_HANDLER(DMA1_CHANNEL0_1_IRQHandler,2)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
//bsp_test_gpio_reverse();
ew_rtu_tx_complete_isr( );
DMA_ClearFlag(USART_DMA_TX_TC_FLAG);
}
INTERRUPT_HANDLER(TIM2_CC_USART2_RX_IRQHandler,20)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
if(USART_GetITStatus(EW_USART, USART_IT_IDLE) != RESET)
{
unsigned char temp;
temp = EW_USART->SR;
temp = EW_USART->DR;//IDLE清零需要依次读SR 和DR 寄存器
(void )temp;
USART_ClearITPendingBit(EW_USART, USART_IT_IDLE);
ew_rtu_received_isr( );
}
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|