串列埠dma實質上就是在dma控制器的控制下將記憶體中的資料(比如我們定義的乙個陣列)乙個位元組乙個位元組複製到,串列埠資料暫存器,然後傳送出去,傳送過程由dma控制,不用我們**控制。而對於傳統串列埠傳送,要傳送字串一般是要用迴圈語句,而用dma只需要配置好相關暫存器就可以自動傳送字串。
dma時鐘和外設時鐘都要初始化
rcc_ahbperiphclockcmd(rcc_ahbperiph_dma1, enable);
rcc_apb2periphclockcmd(rcc_apb2periph_usart1|rcc_apb2periph_gpioa,enable);
gpio_inittypedef gpio_initstructure;
usart_inittypedef usart1_structure;
//usart1_tx gpioa.9
gpio_initstructure.gpio_pin = gpio_pin_9;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_initstructure.gpio_mode = gpio_mode_af_pp; //¸´óãíæíìêä³ö
gpio_init(gpioa, &gpio_initstructure);//³õê¼»¯gpioa.9
usart1_structure.usart_baudrate=9600;
usart1_structure.usart_hardwareflowcontrol=usart_hardwareflowcontrol_none;
usart1_structure.usart_mode=usart_mode_rx|usart_mode_tx;
usart1_structure.usart_parity=usart_parity_no;
usart1_structure.usart_stopbits=usart_stopbits_1;
usart1_structure.usart_wordlength=usart_wordlength_8b;
rcc_apb2periphclockcmd(rcc_apb2periph_usart1|rcc_apb2periph_gpioa,enable);
usart_init(usart1,&usart1_structure);
usart_cmd(usart1,enable);
這裡我們開啟dma完成中斷
dma_inittypedef dma_initstructure;
rcc_ahbperiphclockcmd(rcc_ahbperiph_dma1, enable);
dma_deinit(dma1_channel4);
dma_initstructure.dma_peripheralbaseaddr =(u32)&usart1->dr;
dma_initstructure.dma_memorybaseaddr = (u32)a;
dma_initstructure.dma_dir = dma_dir_peripheraldst;
dma_initstructure.dma_buffersize = 6; //
dma_initstructure.dma_peripheralinc = dma_peripheralinc_disable;
dma_initstructure.dma_memoryinc = dma_memoryinc_enable;
dma_initstructure.dma_peripheraldatasize = dma_peripheraldatasize_byte;
dma_initstructure.dma_memorydatasize = dma_memorydatasize_byte;
dma_initstructure.dma_mode = dma_mode_normal;
dma_initstructure.dma_priority = dma_priority_medium;
dma_initstructure.dma_m2m = dma_m2m_disable;
dma_init(dma1_channel4, &dma_initstructure);
nvic_initstructure.nvic_irqchannel = dma1_channel4_irqn;
nvic_initstructure.nvic_irqchannelpreemptionpriority = 1;
nvic_initstructure.nvic_irqchannelsubpriority = 1;
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
dma_itconfig(dma1_channel4,dma_it_tc,enable);
注意串列埠的dma使能也要開啟
usart_dmacmd(usart1,usart_dmareq_tx,enable);
dma_cmd(dma1_channel4, enable);
#中斷標誌要手動清除
void dma1_channel4_irqhandler(void)
}
STM32F103 串列埠 DMA中斷實現資料收發
02 stm32f103 串列埠 dma中斷實現資料收發 講了 串列埠 dma空閒中斷實現不定長資料收發的功能,除了利用空閒中斷實現資料收發,還可以利用dma的中斷實現資料的收發,不同之處是後者不能實現不定長資料的接收,本文講解dma中斷的方式實現資料的收發。使用dma的中斷時,無需配置串列埠的中斷...
STM32F103串列埠通訊
usart 通用同步非同步收發器 是乙個序列通訊裝置,可以靈活地與外部裝置進行全雙工資料交換。有別於 usart 還有乙個uart,它是在 usart 基礎上裁剪掉了同步通訊功能,只有非同步通訊。全雙工的,非同步通訊 分數波特率發生器系統 傳送和接收共用的可程式設計波特率,最高達4.5mbits s...
STM32F103串列埠接收中斷溢位問題分析
stm32f103串列埠接收中斷溢位問題分析 本人目前正在做的機械人專案中,存在如下問題 1 小車舵機容易燒毀 分析原因 舵機不能堵轉,堵轉電流瞬間變大,將舵機燒毀,懷疑舵機質量問題以及存在舵機連桿機構不順滑導致堵轉的問題。2 小車手動模式能夠正常長時間執行,一旦上位機bringup指令啟動,建圖d...