打印

STM32F103不进串口中断。但是仿真能进,求助!!!

[复制链接]
760|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kedangxing123|  楼主 | 2021-2-1 19:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己做了块板子,今天调试发现进不了串口DMA中断,在线仿真能进中断,而且有时候下载程序能进一次,求助大师答疑。还有仿真的时候看了一下系统时钟是8M,我接的外部晶振也是8M的,我记得系统默认不是9倍频了吗?是不是我晶振没起震?没起震不是会卡在SystemInit函数里吗?程序能运行,但是从原子程序移植过来的延时函数慢10倍,也就是delay_ms(100)是1秒,怎么回事啊

static void MYDMA_Config_RX(DMA_Channel_TypeDef* DMA_CHx,uint32_t _uCpar,uint32_t _uCmar,uint16_t _uCndtr)
{
  DMA_DeInit(DMA_CHx);
  DMA_InitStructure.DMA_PeripheralBaseAddr = _uCpar;// DMA外设ADC基地址
  DMA_InitStructure.DMA_MemoryBaseAddr =_uCmar;// DMA内存基地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//数据传输方向
  DMA_InitStructure.DMA_BufferSize = _uCndtr ;//DMA通道的DMA缓存的大小
  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_VeryHigh;//
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //  DMA通道x没有设置为内存到内存传输
  DMA_Init(DMA_CHx, &DMA_InitStructure);//  
         
}

/*******************************************************************************
* 函 数 名         : Uart_Init
* 函数功能                    : 串口配置:串口1,8位数据位,1位停止位,无校验,无流控制,
                     使能接收和发送,打开中断,使能DMA接收。
* 输    入         : _ucBaud:波特率
* 输    出         : 无
*******************************************************************************/

void Uart_Init(uint32_t _Baud)
{
        GPIO_InitTypeDef GPIO_InitStructure;            //声明一个结构体变量,用来初始化GPIO
        USART_InitTypeDef  USART_InitStructure;          //声明一个结构体变量,用来初始化串口
        NVIC_InitTypeDef NVIC_InitStructure;      //声明一个结构体变量,用来设置串口中断
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);  //打开串口1时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);           //打开时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   //打开GPIOA外设时钟
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);      //打开DMA1时钟
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;     //串口输出PA9
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;               //复用推挽输出
        GPIO_Init(GPIOA,&GPIO_InitStructure);  /* 初始化串口输出IO */
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;           //串口输入PA10       
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;           //
        GPIO_Init(GPIOA,&GPIO_InitStructure);  /* 初始化串口输入IO */
       
        USART_InitStructure.USART_BaudRate=_Baud;                            //波特率
        USART_InitStructure.USART_WordLength=USART_WordLength_8b;                //数据长8位
        USART_InitStructure.USART_StopBits=USART_StopBits_1;                        //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);        /* 初始化USART1 */       
        USART_Cmd(USART1, ENABLE);//使能UART1
        USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//使能或者失能指定的USART中断 接收中断
        USART_ClearFlag(USART1,USART_FLAG_TC);//清除USARTx的待处理标志位
       
        MYDMA_Config_RX(DMA1_Channel5,(u32)&USART1->DR,(u32)&_ucRecv_Buff,8);
        USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); //使能串口1的DMA接收
        DMA_Cmd(DMA1_Channel5, ENABLE);  //使能串口DMA传输         
       
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                 //打开USART1的全局中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;         //抢占优先级为0
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                         //响应优先级为0
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                         //使能
        NVIC_Init(&NVIC_InitStructure);       
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                            //对中断进行分组,优先级
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;                 //打开USART1的全局中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;         //抢占优先级为3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                        //响应优先级为3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                         //使能
        NVIC_Init(&NVIC_InitStructure);                       
}

使用特权

评论回复

相关帖子

沙发
xyz549040622| | 2021-2-1 20:52 | 只看该作者
你最好用库函数读取一下主频到底是多少,主频不对,其他的肯定都不对了。

使用特权

评论回复
板凳
叶春勇| | 2021-2-1 20:58 | 只看该作者
帮顶一下,拥抱stm32cube吧,用hal库

使用特权

评论回复
地板
kedangxing123|  楼主 | 2021-2-1 21:06 | 只看该作者
xyz549040622 发表于 2021-2-1 20:52
你最好用库函数读取一下主频到底是多少,主频不对,其他的肯定都不对了。 ...

主频是8M

使用特权

评论回复
5
kedangxing123|  楼主 | 2021-2-2 11:07 | 只看该作者
有哪位大哥知道的嘛

使用特权

评论回复
6
xyz549040622| | 2021-2-3 18:11 | 只看该作者

倍频后的主频,再说,你都不用cubemx的吗,多方便。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

19

帖子

0

粉丝