OpenEdv-开源电子网

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

关于STM32系列MCU初始化问题。

[复制链接]

69

主题

216

帖子

0

精华

高级会员

Rank: 4

积分
514
金钱
514
注册时间
2012-3-21
在线时间
0 小时
发表于 2013-7-13 19:35:39 | 显示全部楼层 |阅读模式

   是这样的,我一块板子上的mcu型号是STM32F103C8T6,我用它通过SPI线连接一块RF芯片。第一步是先初始化MCU,然后通过SPI线将一个值写入RF芯片的某个寄存器,再读出那个寄存器的值,判断是否成功,如果成功证明MCU初始化成功了。但现在初始化MCU后,写入的值和读出的值不一样,说明MCU初始化失败。我不知道初始化过程中是哪一步失败了,下面是我的stm32初始化代码。

          RCC_Configuration();
                RCC->CR |= (uint32_t)0x00000001;
                     /* Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0] and MCO[2:0] bits */
                 RCC->CFGR &= (uint32_t)0xF8FF0000; 
                     /* Reset HSEON, CSSON and PLLON bits */
                 RCC->CR &= (uint32_t)0xFEF6FFFF;
                     /* Reset HSEBYP bit */
                 RCC->CR &= (uint32_t)0xFFFBFFFF;
                    /* Reset PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE bits */
                 RCC->CFGR &= (uint32_t)0xFF80FFFF;
                     /* Disable all interrupts */
                 RCC->CIR = 0x00000000;

                RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); 

                RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); 

                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); 
                SetSysClockTo72();
 
         GPIO_Configuration();
               /*
                 就是配置一些引脚,应该不会出问题,就不贴出来了
               */

         SPI_Configuration();
               SPI_InitTypeDef  SPI_InitStructure; 
                  /* SPI configuration */
               SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
               SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
               SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
               SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
               SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
               SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
               SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
               SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
               SPI_InitStructure.SPI_CRCPolynomial = 7;
 
               SPI_Init(SPI1, &SPI_InitStructure);
               SPI_Cmd(SPI1, ENABLE);

         DMA_Argument_Configuration();
               DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);
               DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)0;
               DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
               DMA_InitStructure.DMA_BufferSize = 0;
               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_DeInit(DMA1_Channel4); 
               DMA_DeInit(DMA1_Channel5);  

         NVIC_Configuration();
                 /* Configure the NVIC Preemption Priority Bits*/ 
               NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
                 /* Set the Vector Table base location at 0x08000000 */
               NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  
                NVIC_InitTypeDef NVIC_InitStructure;
   
                NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);

                NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);
   
                NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);
   
                  /* Enable the USART1 Interrupt */
                NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占优先级
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;  //子优先级
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);
    
                NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;

                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);    
        
                   /* Configure DMA1_Channel_Tx interrupt */
                 NVIC_SetPriority(DMA1_Channel4_IRQn, 0x06);
                 NVIC_EnableIRQ(DMA1_Channel4_IRQn);
   
                 NVIC_SetPriority(DMA1_Channel5_IRQn, 0x07);
                 NVIC_EnableIRQ(DMA1_Channel5_IRQn);
   
         IWDG_Configuration();   
                 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
                    /* IWDG counter clock: 40KHz(LSI) / 64 = 0.625 KHz */
                 IWDG_SetPrescaler(IWDG_Prescaler_64);
                    /* Set counter reload value to 4000 *64 / 40K = 6.25s */
                 IWDG_SetReload(4000);
                    /* Reload IWDG counter */
                 IWDG_ReloadCounter();
                 IWDG_Enable(); 


 /*******************    测试mcu初始化是否成功    *************************/
   
    uint8_t write_value=2;
    uint8_t read_value;
    pal_trx_reg_write(RG_TRX_STATE,write_value);  //向寄存器RG_TRX_STATE中写入write_value
    read_value=pal_trx_reg_read(RG_TRX_STATE);  //读出上述寄存器的值
    if(read_value != write_value)    //判断是否相等,如果不等说明stm32初始化失败
    {
      while(1);
    }
   
    /*******************    测试mcu初始化是否成功    *************************/


我不明白的是,stm32F101CBT6 和 stm32F103C8T6 的初始化不同之处在哪里?  RCC_Configuration()、GPIO_Configuration()、 SPI_Configuration()、DMA_Argument_Configuration()、NVIC_Configuration()、IWDG_Configuration() 应该是相同的吧? 



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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-13 21:13:45 | 显示全部楼层
回复【楼主位】servent:
---------------------------------
频率就不同.
101最快不过36Mhz,跑快了,估计就直接就地倒了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 03:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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