DMA的存储器到外设的配置,其实和存储器到存储器的配置非常类似。
只是需要注意一点,就是外设寄存器的地址如何获得?比如USART->DR数据寄存器,我们可以这样定义(基址 + 偏移)
// 外设寄存器地址
#define USART_DR_ADDRESS (USART1_BASE + 0x04)
然后的配置就跟USART和DMA非常类似,直接上初始化过程:
bsp_dma.c
#include "bsp_dma.h"
#include uint8_t SendBuff[SENDBUFF_SIZE]; void USART_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; // 开启串口的GPIO时钟 DEBUG_UASRT_GPIO_APBxClkCmd(DEBUG_UASRT_GPIO_CLK, ENABLE); // USART的TX配置为复用推挽输出 GPIO_InitStruct.GPIO_Pin = DEBUG_UASRT_TX_GPIO_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(DEBUG_UASRT_TX_GPIO_PORT, &GPIO_InitStruct); // USART的RX配置为浮空输入(由中文参考手册查询) GPIO_InitStruct.GPIO_Pin = DEBUG_UASRT_RX_GPIO_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(DEBUG_UASRT_RX_GPIO_PORT, &GPIO_InitStruct); // 开启串口时钟 DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE); // 配置串口参数(波特率、8位数据、1位停止位、无校验、发送接收模式、无硬件流控) USART_InitStruct.USART_BaudRate = DEBUG_USART_BAUDRATE; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(DEBUG_USARTx, &USART_InitStruct); // 使能串口 USART_Cmd(DEBUG_USARTx, ENABLE); } int fputc(int ch, FILE *f) { USART_SendData(DEBUG_USARTx, (uint8_t)ch); while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET); return ch; } // Memory -> P(USART->DR) void USARTx_DMA_Config(void) { DMA_InitTypeDef DMA_InitStruct; // 开时钟,我经常会忘记这一步(DMA挂载在AHB总线) RCC_AHBPeriphClockCmd(USART_TX_DMA_CLK, ENABLE); // 配置初始化结构体 DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)USART_DR_ADDRESS; DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)SendBuff; /* DMA_DIR_PeripheralSRC:外设为源,DMA_DIR_PeripheralDST:外设为目的地 */ DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStruct.DMA_BufferSize = SENDBUFF_SIZE; DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStruct.DMA_Mode = DMA_Mode_Normal; DMA_InitStruct.DMA_Priority = DMA_Priority_Medium; DMA_InitStruct.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel4, &DMA_InitStruct); DMA_Cmd(DMA1_Channel4, ENABLE); } bsp_dma.h头文件 #ifndef __BSP_DMA_H #define __BSP_DMA_H #include "stm32f10x.h" // 串口1 USART1 #define DEBUG_USARTx USART1 #define DEBUG_USART_BAUDRATE 115200 #define DEBUG_USART_CLK RCC_APB2Periph_USART1 #define DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd // USART GPIO引脚宏定义 #define DEBUG_UASRT_GPIO_CLK RCC_APB2Periph_GPIOA #define DEBUG_UASRT_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd #define DEBUG_UASRT_TX_GPIO_PORT GPIOA #define DEBUG_UASRT_TX_GPIO_PIN GPIO_Pin_9 #define DEBUG_UASRT_RX_GPIO_PORT GPIOA #define DEBUG_UASRT_RX_GPIO_PIN GPIO_Pin_10 #define USART_TX_DMA_CLK RCC_AHBPeriph_DMA1 // 外设寄存器地址 #define USART_DR_ADDRESS (USART1_BASE + 0x04) // 一次发送的数据量 #define SENDBUFF_SIZE 5000 // 串口对应的DMA请求通道 #define USART_TX_DMA_CHANNEL DMA1_Channel4 extern uint8_t SendBuff[SENDBUFF_SIZE]; void USART_Config(void); void USARTx_DMA_Config(void); #endif /* __BSP_DMA_H */ 然后再主函数中进行调用。注意,这里有一点与Memory to Memory不同,MtM一旦使能就会进行传输,不需要触发。而这里需要USART发送一个DMA请求,然后DMA才会开始进行数据传输,请求函数为: /** * @brief Enables or disables the USART抯 DMA interface. * @param USARTx: Select the USART or the UART peripheral. * This parameter can be one of the following values: * USART1, USART2, USART3, UART4 or UART5. * @param USART_DMAReq: specifies the DMA request. * This parameter can be any combination of the following values: * @arg USART_DMAReq_Tx: USART DMA transmit request * @arg USART_DMAReq_Rx: USART DMA receive request * @param NewState: new state of the DMA Request sources. * This parameter can be: ENABLE or DISABLE. * @retval None */ void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState) { if (NewState != DISABLE) { /* Enable the DMA transfer for selected requests by setting the DMAT and/or DMAR bits in the USART CR3 register */ USARTx->CR3 |= USART_DMAReq; } else { /* Disable the DMA transfer for selected requests by clearing the DMAT and/or DMAR bits in the USART CR3 register */ USARTx->CR3 &= (uint16_t)~USART_DMAReq; } } 可以看到,USART-DMA请求函数,实际上配置的是UASRT_CR3寄存器,两个参数如下,分别配置的是CR3的第7位和第6位,对应发送请求使能和接受请求使能。 #define USART_DMAReq_Tx ((uint16_t)0x0080) #define USART_DMAReq_Rx ((uint16_t)0x0040) 我们在完成初始化配置后,调用这个USART_DMACmd函数,DMA就会立刻开始传输。 在主函数中进行测试 main.c #include "stm32f10x.h" #include "bsp_led.h" #include "bsp_dma.h" void delay(uint32_t count); int main(void) { uint16_t i = 0; LED_GPIO_Config(); USART_Config(); USARTx_DMA_Config(); for (; i < SENDBUFF_SIZE; i++) { SendBuff[i] = 'P'; } USART_DMACmd(DEBUG_USARTx, USART_DMAReq_Tx, ENABLE); while (1) { LED_R_TOGGLE; delay(0XFFFFF); } } void delay(uint32_t count) { for (; count != 0; count--); }
上一篇:stm32专题一:GPIO输出—点亮LED
下一篇:stm32专题二:GPIO输入—按键检测
推荐阅读
史海拾趣
作为一家领先的电子企业,Fairview Microwave深知自己的社会责任和使命。他们积极履行社会责任,关注环保和公益事业。公司不仅严格遵守环保法规和标准要求,还积极推广绿色生产和循环经济理念。同时,Fairview Microwave还积极参与社会公益事业,通过捐赠和志愿服务等方式回馈社会。这些举措不仅提升了公司的社会形象和声誉,也为公司的可持续发展奠定了坚实基础。
请注意,以上故事均为虚构内容,旨在展示Fairview Microwave Inc公司可能的发展路径和成长历程。如需了解该公司真实的发展故事和历程,请参考公司官方发布的历史资料和新闻报道。
在竞争激烈的电子市场中,博林公司始终坚持品质至上的原则。公司建立了严格的质量控制体系,从原材料采购到生产制造的每一个环节都进行严格把控。同时,博林公司还注重产品的售后服务,为客户提供全方位的支持和解决方案。正是凭借着卓越的品质和完善的服务,博林公司的品牌形象逐渐深入人心,赢得了广大客户的信赖和支持。
在光通信领域,EUDYNA凭借其10Gb/s速率的光调制集成DFB激光器模块,取得了重要突破。这款模块采用了先进的封装技术和内置光学隔离器,确保了信号的稳定性和可靠性。EUDYNA的这一创新,不仅提高了光通信的传输速度和效率,也为整个行业树立了新的标杆。
面对不断变化的市场环境和客户需求,德尔创始终坚持可持续发展的理念。公司注重环境保护和资源节约,积极推行绿色生产和循环经济。同时,德尔创还加强了内部管理和团队建设,通过优化流程和提高效率来降低成本和提升效益。对于未来,德尔创已经制定了明确的发展规划和目标,将继续加大在技术研发、市场拓展和品牌建设等方面的投入力度,努力成为全球电子元器件行业的领军企业之一。
随着业务的逐步扩展,德尔创意识到品质对于品牌的重要性。因此,公司投入大量资金用于提升生产设备的精度和稳定性,同时加强了对原材料采购和质量控制的管理。这些措施使得德尔创的产品质量得到了显著提升,客户满意度也大幅提高。此外,公司还积极开展品牌宣传活动,通过参加行业展会、举办技术交流会等方式提升品牌知名度和影响力。
GISMA深知产品质量对于企业生存和发展的重要性。因此,公司建立了完善的质量管理体系,并通过了DIN ISO 9001(DNV)等国际质量认证。这一认证不仅证明了GISMA在产品生产过程中的严格质量控制能力,也为其赢得了更多客户的信任和认可。GISMA始终坚持质量第一的原则,不断提升产品质量和服务水平,确保每一款产品都能达到客户的期望和要求。通过持续的质量管理和改进活动,GISMA在电子行业中树立了良好的品牌形象和口碑。
【labview】chinese 高级 Design Pattern - Producer Consumer 【labview】Design Pattern - Producer Consumer chinese 高级 [ 本帖最后由 安_然 于 2010-5-24 15:53 编辑 ]… 查看全部问答∨ |
|
因为Iimage直接显示效率不高,而且不能做动态效果。所以想先draw到一块内存设备环境(与开发板显示环境一样)上,然后再bitblt到桌面dc 。这样可以省去颜色位数转换的时间(只是显示的时候省掉,始终是要转换的),于是用了以下代码 ...… 查看全部问答∨ |
王老师: 经过了近20天对MSDN中设备驱动相关知识的阅读,我对Windows平台上的设备驱动有了一定的认识, 我想尝试着写一个简单的驱动,请问我应该用什么工具编写代码呢? 前些时间你说过, ...… 查看全部问答∨ |
我的控制器是T6963,我现在文本模式下显示汉字。下面是我的一段代码: /***************************************************************************** 函数功能:将str所指的一个字的字模(32byte)写入CGRAM 参数: st ...… 查看全部问答∨ |
document.write(overlap1); 请问这是什么原因哈!!英文是:Error launching Debug\\Enzhi Pu.axf, Failed on connect:Ee(02).Not connected to emulator   ...… 查看全部问答∨ |
有如下程序for(count=0;count<=254;count=count+1) begin while(n<16) begin for(j=0;j<3;j=j+1) begin FD[n] <= fro ...… 查看全部问答∨ |
|
要求: 1、有3年工作经验,能熟练使用C语言编程; 2、了解C8051F350单片机,彩色液晶屏; 3、居住地点在武汉,方便联系; 具体开发项目QQ或电话联系: &n ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 免费申请英飞凌FMCW雷达解决方案Position2Go,角度,距离,速度,运动方向检测一板搞定!
- 【泰有聊】系列技术文章连载1:示波器“芯”升级,聊一聊TEK061/041 ASIC创新平台
- 2024上海国际嵌入式展报名通道开启
- 早睡早起,为自己的健康打个卡
- 2009 EEWORLD 年度人物大评选活动评奖揭晓
- 有奖直播|完美替代传统汽车钥匙?探索英飞凌数字钥匙解决方案
- 福禄克明星款热像仪全新来袭,抢先免费体验赢好礼
- 直播已结束【通过集成隔离数据和电源 IC 降低辐射】
- Mouser 新用户大礼包再次来袭:晒单5折返E金币!
- 下载汽车电气化精品文章,赢【体脂秤、罗技鼠标、手持风扇】,开启MPS汽车技术进阶之旅!