一、需求:
通过上位机与UART连接,将接收到的100个字节数据通过CAN进行发送并接收 (使用回环模式)接收的数据通过对应串口再发送到上位机进行显示;CAN总线的参数为500K波特率,80%采样点,发送周期为100ms。
二、功能分析:
就是电脑 串口助手发100个数据到串口 DMA接收,经过can 回环模式,再用串口DMA发回电脑。
三、代码如下:
int main(void)
{
GPIO_init();
Systick_Config();
GD_eval_com_init(EVAL_COM0);
RCU_periph_clock_enable(RCU_CAN0);
NVIC_irq_enable(CAN0_RX1_IRQn,0,0);
UART_DmaConfig();
DMA_channel_enable(DMA1, DMA_CH7);
DMA_channel_enable(DMA1, DMA_CH2);
UART_dma_receive_config(USART0, USART_RECEIVE_DMA_ENABLE);
UART_dma_transmit_config(USART0, USART_TRANSMIT_DMA_ENABLE);
CAN_loopback_init();
while(1)
{
us_tmp_cnt1++;
dma_channel_disable(DMA1, DMA_CH2);
dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_FEE);
dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_SDE);
dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_TAE);
dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_HTF);
dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_FTF);
dma_transfer_number_config(DMA1, DMA_CH2, 100);
dma_channel_enable(DMA1, DMA_CH2);
usart_dma_receive_config(USART0, USART_RECEIVE_DMA_ENABLE);
/* wait until USART0 RX DMA1 channel transfer complete */
///等待USART0 RX DMA1信道传输完成/
while(RESET == dma_flag_get(DMA1, DMA_CH2, DMA_INTF_FTFIF))
{
}
dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_FEE);
dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_SDE);
dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_TAE);
dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_HTF);
dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_FTF);
us_tmp_cnt2++;
can_loopback();
us_tmp_cnt3++;
dma_channel_disable(DMA1, DMA_CH7);
dma_flag_clear(DMA1, DMA_CH7, DMA_FLAG_FEE);
dma_flag_clear(DMA1, DMA_CH7, DMA_FLAG_SDE);
dma_flag_clear(DMA1, DMA_CH7, DMA_FLAG_TAE);<