小学生
最后登录1970-1-1
在线时间 小时
注册时间2016-11-24
|
本帖最后由 geming21 于 2016-11-24 14:29 编辑
请各位大虾,帮忙看看代码,小弟感激不尽。。。查过资料,搞了两周了,都没有头绪。我是自学,,,,
实验目的:内存定义一个数组SendBuff,通过DMA1 和USART1把数组发送出去。数据发送完成后,在中断函数内点亮LED灯。
硬件平台: stm32f103evt;软件平台:keil4;库版本:3.5
实现现象: 若数组内的5个数都定义为0x12,则无任何输出;若都定义为0x55,则输出UUUUU。另外无论串口是否有输出,LED灯都会被点亮。
附件是我的主函数 和中断函数代码。
最后 感谢各位帮助
这是主函数
- #include "stm32f10x.h"
- #include <stdio.h> //下面strlen函数需要此头文件
- u8 SendBuff[5]= {0x55,0x55,0x55,0x55,0x55};
- //void Delay( u32 nCount);
- void SYS_RCC_CFG(void);
- void LED_GPIO_CFG(void);
- void DMA_USART1_CFG(void);
- void USART1_CFG(void);
- void NVIC_CFG(void);
- int main(void)
- {
- SYS_RCC_CFG();
- // Delay(0x2fffe);
- LED_GPIO_CFG(); //时钟初始化必须在GPIO初始化之前
- DMA_USART1_CFG();
- NVIC_CFG();
- USART1_CFG();
- printf("\r\n this is a demo \r\n"); //验证串口是否正常
- /*串口向DMA发出请求*/
- DMA_Cmd(DMA1_Channel4,ENABLE); //使能DMA
- USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
- /*在DMA尚未传送完成时,CPU继续执行main函数中的代码*/
- while(1);
- }
- //void Delay( u32 nCount )
- //{
- // for(; nCount!=0; nCount--);
- //}
- void SYS_RCC_CFG(void)
- {
- RCC_DeInit(); /*设置时钟系统寄存器为默认值*/
- RCC_HSEConfig(RCC_HSE_ON); /*设置HSE为系统时钟源*/
- while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); /*等待HSE时钟源准备就绪*/
- // while(RCC_WaitForHSEStartUp() == ERROR);
- RCC_HCLKConfig(RCC_SYSCLK_Div1);
- RCC_PCLK2Config(RCC_HCLK_Div1);
- RCC_PCLK1Config(RCC_HCLK_Div2);
- RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
- RCC_PLLCmd(ENABLE);
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
- while(RCC_GetSYSCLKSource() != 0x08);
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE); //使用串口必须使能AFIO时钟
- }
- void LED_GPIO_CFG(void)
- {
- // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
- GPIO_InitTypeDef GPIO_InitStructure;
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB,&GPIO_InitStructure);
-
- }
- void USART1_CFG(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- // USART_ClockInitTypeDef USART_ClockInitStructure;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- // USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
- // USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;//空闲时钟为低电平
- // USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;//时钟第二个边沿进行数据捕获
- // USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;//最后一位数据的时钟脉冲不从SCLK输出
- // USART_ClockInit(USART1, &USART_ClockInitStructure);
- USART_InitStructure.USART_BaudRate = 115200;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- USART_InitStructure.USART_Parity = USART_Parity_No;
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
- USART_Init(USART1, &USART_InitStructure);
- USART_Cmd(USART1, ENABLE);
- }
- void NVIC_CFG(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
-
- /* Configure one bit for preemption priority */
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
-
- /* 配置DMA通道4为中断源 */
- 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);
- }
- void DMA_USART1_CFG(void)
- {
- DMA_InitTypeDef DMA_InitStructure;
- // RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //开启DMA时钟
- DMA_ClearITPendingBit(DMA1_IT_TC4);
- // DMA_Cmd(DMA1_Channel4,DISABLE); //临时添加 禁止DMA
- DMA_DeInit(DMA1_Channel4);
-
- /*设置DMA源:内存地址&串口数据寄存器地址*/
- DMA_InitStructure.DMA_PeripheralBaseAddr = (u32) (&USART1->DR); //0x40013804;
- /*内存地址(要传输的变量的指针)*/
- DMA_InitStructure.DMA_MemoryBaseAddr = (u32) SendBuff;
-
- /*方向:从内存到外设*/
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
-
- /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/
- DMA_InitStructure.DMA_BufferSize = 5; //SENDBUFF_SIZE;
-
- /*外设地址不增*/
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
-
- /*内存地址自增*/
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
-
- /*外设数据单位*/
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
-
- /*内存数据单位 8bit*/
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
-
- /*DMA模式:一次传输,循环*/
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
-
- /*优先级:中*/
- DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
-
- /*禁止内存到内存的传输 */
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
-
- /*配置DMA1的4通道*/
- DMA_Init(DMA1_Channel4, &DMA_InitStructure);
- DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE); //配置DMA发送完成后产生中断
- }
- //加入以下代码,支持printf函数,而不需要选择use MicroLIB
- /***************************START*********************/
- #if 1
- #pragma import(__use_no_semihosting)
- //标准库需要的支持函数
- struct __FILE
- {
- int handle;
- /* Whatever you require here. If the only file you are using is */
- /* standard output using printf() for debugging, no file handling */
- /* is required. */
- };
- /* FILE is typedef’ d in stdio.h. */
- FILE __stdout;
- //定义_sys_exit()以避免使用半主机模式
- _sys_exit(int x)
- {
- x = x;
- }
- //重定义fputc函数
- int fputc(int ch, FILE *f)
- {
- USART_SendData(USART1, (u8) ch);
- USART_ClearFlag(USART1,USART_FLAG_TC); //[特别注意] 此条代码是防止丢失传输数据的第一个字符
- while( USART_GetFlagStatus(USART1,USART_FLAG_TC)== RESET);
- return (ch);
- // USART1->DR = (u8) ch;
- // while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
- // return ch;
- }
- #endif
- //
复制代码
以下是中断函数部分
- void DMA1_Channel4_IRQHandler(void)
- {
- //判断是否为DMA发送完成中断
- // if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)
- if(DMA_GetITStatus(DMA1_IT_TC4)==SET)
- {
- //LED关闭
-
- LED_ON;
- DMA_Cmd(DMA1_Channel4,DISABLE); //临时添加 禁止DMA
-
- DMA_ClearITPendingBit(DMA1_IT_TC4);
- // DMA_ClearFlag(DMA1_FLAG_TC4);
- }
- }
复制代码
|
|