STM32F103 串列埠DMA 庫函式程式設計

2021-10-23 03:12:22 字數 2720 閱讀 9534

串列埠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...