【无标题】STM32103FC8-DMA—直接存储区访问学习
1.添加基础库stm 官网下载地址https://doc.embedfire.com/products/link/zh/latest/mcu/stm32/stm32f103c8t6_core_new1.html项目参数配置Preprocessor Symbols Define 设置参数USE_STDPERIPH_DRIVER,USE_STM3210C_EVAL#需要添加的文件mcu 配置startup_stm32f10x_hd.score 配置Libraries\CMSIS\CM3\CoreSupport 所有文件inc配置Libraries\STM32F10x_StdPeriph_Driver\inc 文件夹所有文件src配置Libraries\STM32F10x_StdPeriph_Driver\src 文件夹所有文件eval 配置 Utilities\STM32_EVAL\STM3210C_EVAL 文件夹所有文件fonts 配置Utilities\STM32_EVAL\Common\fonts.h 文件项目配置Project\STM32F10x_StdPeriph_Examples\SysTick\TimeBase 文件夹下 【stm32f10x_conf.hstm32f10x_it.c,stm32f10x_it.h,system_stm32f10x.c】源码#includestm32f10x.h#includestm32_eval.h#includestm32f10x_gpio.h#includestm32f10x_it.h#includestm32_eval.h#includestm32f10x_rcc.h//当使用存储器到存储器模式时候通道可以随便选没有硬性的规定#defineDMA_CHANNELDMA1_Channel6#defineDMA_CLOCKRCC_AHBPeriph_DMA1//传输完成标志#defineDMA_FLAG_TCDMA1_FLAG_TC6//要发送的数据大小#defineBUFFER_SIZE32#defineDEBUG_USARTxUSART1#defineDEBUG_USART_CLKRCC_APB2Periph_USART1#defineDEBUG_USART_APBxClkCmdRCC_APB2PeriphClockCmd#defineDEBUG_USART_BAUDRATE115200//usart gpio 引脚定义#defineDEBUG_USART_GPIO_CLK(RCC_APB2Periph_GPIOA)#defineDEBUG_USART_GPIO_APBxClkCmdRCC_APB2PeriphClockCmd#defineDEBUG_USART_TX_GPIO_PROTGPIOA#defineDEBUG_USART_TX_GPIO_PINGPIO_Pin_9#defineDEBUG_USART_RX_GPIO_PORTGPIOA#defineDEBUG_USART_RX_GPIO_PINGPIO_Pin_10//串口对应的DMA请求通带#defineUSART_TX_DMA_CHANNELDMA1_Channel4//外设寄存器地址#defineUSART_DR_ADDRESS(USART1_BASE0x04)//一次发送的数据量#defineSENDBUF_SIZE5000//定义DMA传输目标存储器 存储器在内部的SRAM中uint32_taDST_BUffer[BUFFER_SIZE];constuint32_taSRC_Const_Buffer[BUFFER_SIZE]{0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20,0x21222324,0x25262728,0x292A2B2C,0x2D2E2F30,0x31323334,0x35363738,0x393A3B3C,0x3D3E3F40,0x41424344,0x45464748,0x494A4B4C,0x4D4E4F50,0x51525354,0x55565758,0x595A5B5C,0x5D5E5F60,0x61626364,0x65666768,0x696A6B6C,0x6D6E6F70,0x71727374,0x75767778,0x797A7B7C,0x7D7E7F80};voidDMA_Config(void){DMA_InitTypeDef DMA_InitStructure;//开启DMA时钟RCC_AHBPeriphClockCmd(DMA_CLOCK,ENABLE);//源数据地址DMA_InitStructure.DMA_PeripheralBaseAddr(uint32_t)aSRC_Const_Buffer;//目标地址DMA_InitStructure.DMA_MemoryBaseAddr(uint32_t)aDST_BUffer;//方向外设到存储器这里的外设时内部FLASHDMA_InitStructure.DMA_DIRDMA_DIR_PeripheralSRC;//传输大小DMA_InitStructure.DMA_BufferSizeBUFFER_SIZE;//外设内部的Flash 地址递增DMA_InitStructure.DMA_PeripheralIncDMA_PeripheralInc_Enable;//内存地址递增DMA_InitStructure.DMA_MemoryIncDMA_MemoryInc_Enable;//外设数据单位DMA_InitStructure.DMA_PeripheralDataSizeDMA_PeripheralDataSize_Word;//内存数据单位DMA_InitStructure.DMA_MemoryDataSizeDMA_MemoryDataSize_Word;//DMA 模式一次或者循环模式DMA_InitStructure.DMA_ModeDMA_Mode_Normal;//优先级高DMA_InitStructure.DMA_PriorityDMA_Priority_High;//使能内存到内存的传输DMA_InitStructure.DMA_M2MDMA_M2M_Enable;//配置DMA通道DMA_Init(DMA_CHANNEL,DMA_InitStructure);//使能DMADMA_Cmd(DMA_CHANNEL,ENABLE);}uint8_tBuffercmp(constuint32_t*pBuffer,uint32_t*pBuffer1,uint16_tBufferLength){//数据长度递减while(BufferLength--){//判断两个数据源是否对应相等if(*pBuffer!*pBuffer1){//对应数据源不相等满上退出函数返回0return0;}//递增两个数据源的地址指针pBuffer;pBuffer1;}//完成判断并且对应数据相对return1;}voidUSARTx_DMA_Config(void){DMA_InitTypeDef DMA_InitStucture;//开启DMA时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//设置DMA源地址串口数据寄存器地址DMA_InitStucture.DMA_PeripheralBaseAddrUSART_DR_ADDRESS;//内存地址要传输的变量的指针// DMA_InitStucture.DMA_MemoryBaseAddr (u32) Send;}voidDelay(__IOuint32_tnCount)//简单的延时函数{for(;nCount!0;nCount--);}/** * 微妙级延时适配任意主频依赖SystemCoreClock 全局变量 * parems us 延时的微妙数 */voiddelay_us(uint32_tus){SysTick-LOAD(SystemCoreClock/1000000)*us-1;// 设置重载值72MHz 下1us 计数72次SysTick-VAL0x00;//清空当前计数值SysTick-CTRLSysTick_CTRL_ENABLE_Msk|SysTick_CTRL_CLKSOURCE_Msk;//使能SysTick 时while(!(SysTick-CTRLSysTick_CTRL_COUNTFLAG_Msk));//等待计数完成SysTick-CTRL0x00;//关闭SysTick}voidLED_GPIO_Config(void){/*定义一个GPIO_InitTypeDef 类型的结构体*/GPIO_InitTypeDef GPIO_InitSture;/*开启LED相关的GPIO外设时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/*选择要控制的GPIO引脚*/GPIO_InitSture.GPIO_PinGPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;/*选择引脚模式为通用推挽输出*/GPIO_InitSture.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitSture.GPIO_SpeedGPIO_Speed_50MHz;/*设置引脚的速率为50HZ*/GPIO_Init(GPIOA,GPIO_InitSture);GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);}intmain(void){// SystemInit();//定义存放比较结果变量uint8_tTransferStatus;//LED 端口初始化LED_GPIO_Config();//设置蓝灯亮GPIO_ResetBits(GPIOA,GPIO_Pin_3);//设置延时函数delay_us(5000000);//DMA 传输配置DMA_Config();//等待DMA传输完成while(DMA_GetFlagStatus(DMA_FLAG_TC)RESET){}//比较源数据与传输后的数据TransferStatusBuffercmp(aSRC_Const_Buffer,aDST_BUffer,BUFFER_SIZE);//判断源数据与传输后数据比较结果if(TransferStatus0){//源数据与传输后数据不相等的RGB彩色灯显示红色GPIO_ResetBits(GPIOA,GPIO_Pin_1);}else{//源数据与传输后数据不相等的RGB彩色灯显示绿色GPIO_ResetBits(GPIOA,GPIO_Pin_2);}while(1){}}参考文档https://doc.embedfire.com/mcu/stm32/f103zhinanzhe/std/zh/latest/book/DMA.html