OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4917|回复: 1

请问大神,我代码串口中断怎么进不去呢?代码如下

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2021-5-19
在线时间
4 小时
发表于 2021-6-22 16:59:40 | 显示全部楼层 |阅读模式
1金钱
#include "adc.h"
#include "delay.h"
  #include "LED.h"
//////////////////////////////////////////////////////////////////////////////////         
       
u16 ADC_ConvertedValue[2]={0};
u8 complete_flag=0;
  u16  USART1_Buffer[2]={0};
    u8   Flag=0;
        u16 Usart1_Rec_Cnt={0};
        uint8_t mytempdata1[2]={0};
       
void  Adc_Init(void)
{        
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1        , ENABLE );          //使能ADC1通道时钟


        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

        //PA1 作为模拟通道输入引脚                        
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1;//设置PA1、PA2为模拟输入
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
        GPIO_Init(GPIOA, &GPIO_InitStructure);       

        ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在独立模式
        ADC_InitStructure.ADC_ScanConvMode =  ENABLE;        //模数转换工作在单通道模式
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;        //模数转换工作在单次转换模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //转换由软件而不是外部触发启动
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = 2;        //顺序进行规则转换的ADC通道的数目
        ADC_Init(ADC1, &ADC_InitStructure);        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   

   ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);  
  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);
       
        ADC_DMACmd(ADC1, ENABLE);
        ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
       
        ADC_ResetCalibration(ADC1);        //使能复位校准  
         
        while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位校准结束
       
        ADC_StartCalibration(ADC1);         //开启AD校准

        while(ADC_GetCalibrationStatus(ADC1));         //等待校准结束
       
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //连续转换开始,ADC通过DMA方式不断的更新RAM区。
}               



void Adc_Dma_init(void)
{
        DMA_InitTypeDef DMA_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
       
       

        DMA_DeInit(DMA1_Channel1);
       
  DMA_InitStructure.DMA_PeripheralBaseAddr  = 0x4001244c; //adc1地址  
  DMA_InitStructure.DMA_MemoryBaseAddr      = (u32)&(ADC_ConvertedValue);  
  DMA_InitStructure.DMA_DIR                 = DMA_DIR_PeripheralSRC;  
  DMA_InitStructure.DMA_M2M                 = DMA_M2M_Disable;  
  DMA_InitStructure.DMA_PeripheralDataSize  = DMA_PeripheralDataSize_HalfWord;  
  DMA_InitStructure.DMA_MemoryDataSize      = DMA_MemoryDataSize_HalfWord;  
  DMA_InitStructure.DMA_BufferSize          = 2;
  DMA_InitStructure.DMA_MemoryInc           = DMA_MemoryInc_Disable;  
  DMA_InitStructure.DMA_PeripheralInc       = DMA_PeripheralInc_Enable;  
  DMA_InitStructure.DMA_Mode                = DMA_Mode_Circular;  
  DMA_InitStructure.DMA_Priority            = DMA_Priority_High;  
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);  
  DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);  
  DMA_Cmd(DMA1_Channel1, ENABLE);       
       
       
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
         

}

void DMA1_Channel1_IRQHandler(void)
{
   if(DMA_GetITStatus(DMA1_IT_TC1)!=RESET)
                 
              complete_flag=1;
                  
             
            DMA_ClearITPendingBit(DMA1_IT_TC1);
         
}


void Usart_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        //使能USART1,GPIOA时钟

        //USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

  //USART1_RX          GPIOA.10初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  


        USART_InitStructure.USART_BaudRate = 115200;//串口波特率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
        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); //初始化串口1
       
          DMA_DeInit(DMA1_Channel4);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32) & (USART1->DR);     //USART1地址
    DMA_InitStructure.DMA_MemoryBaseAddr =(u32)&ADC_ConvertedValue;//内存地址
    DMA_InitStructure.DMA_DIR =DMA_DIR_PeripheralDST;
    DMA_InitStructure.DMA_BufferSize = 2;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址固定
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址递增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;        //循环传输
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel4, &DMA_InitStructure);
    DMA_Cmd(DMA1_Channel4, ENABLE);


          

     USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
     USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
           USART_Cmd(USART1, ENABLE);
                  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 2;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
       


}

void USART1_IRQHandler(void)
{
   u8 Res;
          u8 i;
       
        for(i=0;i<2;i++)
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //mcu接受数据,接收中断
        {
                Res =USART_ReceiveData(USART1);        //读取通过串口1接收到的数据
                mytempdata1[i]=Res;     //通过串口1接收到的数据,发送给串口2       
     Flag=1;
        LED0=1;               
   }                 

}

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "string.h"
#include "adc.h"



int16_t Fx_Temp;
     int16_t Fy_Temp;
           int16_t Fx;
            int16_t Fy;
           u16 Cx=1;
           u16 Cy=1;
           int16_t Vl;
            int16_t Vr;
           u16 n;

int main(void)
{         

       
          delay_init();                     //延时函数初始化          
          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级

           LED_Init();                             //LED端口初始化
                        
          Adc_Init();                                  //ADC初始化
          Adc_Dma_init();

   Usart_Init();
         delay_ms(300);

        while(1)
        {
          
                               
                delay_ms(10);       
       
               
                                       
                        if(complete_flag==1)       
                        {                       
          complete_flag=0;                               
                                          
                                                 if(Flag==1)       
                                                 {
                                     
                                              {

                                            Flag=0;
                                                                        LED1=0;
                          delay_ms(100);
                          LED1=1;
                                        }
               

}
        }
}

}





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6741
金钱
6741
注册时间
2017-4-12
在线时间
1258 小时
发表于 2021-6-22 19:58:18 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-22 21:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表