[STM32F4] STM32F411系统初始化【寄存器方式】

[复制链接]
909|1
 楼主| fxyc87 发表于 2021-4-28 10:51 | 显示全部楼层 |阅读模式
本帖最后由 fxyc87 于 2021-4-28 10:54 编辑
  1. //此代码是我本人原创 xa87@live.cn
  1. for(int i=0;i<0x012345;i++){
  2.                 __nop();                //延时约0.2秒 等待电源稳定
  3.         }
  4.        
  5.         RCC->CR|=BIT(16);                                                        //1: HSE oscillator ON
  6.         while((RCC->CR&BIT(17))==0);        //0: HSE oscillator not ready
  7.         //N=50-432
  8.         //M=2-63
  9.         //vco=in*(n/m)                        vco=100-432M
  10.         //out=vco/p                                        P=2/4/6/8
  11.         //(8M*(200/8))/2=100M
  12.         //PLL时钟源来自外部HSE        /N=6        /M=8
  13.         RCC->PLLCFGR=BIT(22)|(200<<6) |(8<<0);
  14.         //P=0=*2
  15.         RCC->CR|=BIT(24);                                                        //1: PLL ON
  16.         while((RCC->CR&BIT(25))==0);        //Bit 25 PLLRDY: Main PLL (PLL) clock ready flag
  17.         //切换前FLASH时钟等待加长
  18.         FLASH->ACR=6;                                                                        //100M时等待6个周期                        6 WS (7 CPU cycles)
  19.         //APB1最大50M 100/2
  20.         RCC->CFGR|=4<<10;                                                        //APB1        100: AHB clock divided by 2
  21.         //主时钟切换至PLL
  22.         RCC->CFGR|=2;                                                                        //Bits 1:0 SW: System clock switch        /        10: PLL selected as system clock
  23.         while((RCC->CFGR&8)!=8);                        //等待时钟切换完成                p108
  24.         //系统定时器,相关时钟开启
  25.         SystemCoreClockUpdate();
  26.         SysTick_Config(SystemCoreClock/1000);        //1ms时基
  27.        
  28.         RCC->AHB1ENR|=BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(4);
  29.         //GPIO时钟开启
  30.        
  31.         //IO配置
  32.        
  33.         {//2初始化输出点
  34.         //out-en pc15
  35.         GPIOC->ODR|=BIT(15);
  36.         GPIOC->MODER|=1<<(15*2);                //01: General purpose output mode

  37.         uint16_t PinBit;
  38.                
  39.         //pa输出点                位全置0,输出关闭  参见BSP.H
  40.         GPIOA->ODR=0;
  41.         GPIOA->MODER|=                        (1<<(0*2))|                //pinF1
  42.                                                                                 (1<<(1*2))|                //pinF2
  43.                                                                                 (1<<(4*2));                        //pinCS1

  44.         //pb输出点
  45.         GPIOB->ODR=0;
  46.         GPIOB->MODER|=                        (1<<(0*2)) |        (1<<(1*2))        |       
  47.                                                                                 (1<<(8*2)) |        (1<<(9*2))        |       
  48.                                                                                 (1<<(10*2)) |        (1<<(11*2)) |       
  49.                                                                                 (1<<(12*2)) |        (1<<(13*2))        |       
  50.                                                                                 (1<<(14*2)) |        (1<<(15*2));

  51.         //pe 输出点
  52.         GPIOE->ODR=0;
  53.         GPIOE->MODER|=                        (1<<(0*2)) |        (1<<(1*2))        |       
  54.                                                                                 (1<<(2*2)) |        (1<<(3*2))        |       
  55.                                                                                 (1<<(4*2)) |        (1<<(5*2)) |       
  56.                                                                                 (1<<(6*2)) |        (1<<(7*2))        |       
  57.                                                                                 (1<<(8*2)) |        (1<<(9*2))        |
  58.                                                                                 (1<<(10*2)) |        (1<<(11*2))        |
  59.                                                                                 (1<<(12*2)) |        (1<<(13*2))        |
  60.                                                                                 (1<<(14*2)) |        (1<<(15*2));

  61.         }//pc输出

  62.         //pd输出

  63.        
  64.         GPIOC->ODR&=~BIT(15);                //out-en pc15
  65.        
  66.         {//3.初始化输入点
  67.         //下拉输出模式 2MHz;               
  68.        
  69.         //pa输入点
  70.         //pb输入点

  71.         //pe 输入点

  72.         //PC输入(默认就是输入,忽略 )

  73.         //PD输入(默认就是输入,忽略 )
  74.        
  75.         }//Pe输入
  76.        
  77.         //4读取配置       
  78.        
  79.         {//5热电偶初始化 SPI1
  80.         RCC->APB2ENR|=BIT(12);
  81.         //GPIO初始化
  82.         //pa5,pa6复用 SCK MISO
  83.         GPIOA->AFR[0]|=(5<<5*4)|(5<<6*4);                //af5,af5
  84.         GPIOA->MODER|=(2<<(5*2)) | (2<<(6*2));                //10: Alternate function mode
  85.         GPIOA->OSPEEDR|=(2<<(5*2)) | (2<<(6*2));                        //2=GPIO_SPEED_FAST
  86.                
  87.         //max6675 MAX=4.3 MHz
  88.         SPI1->CR1|=BIT(11);                //Bit 11        1: 16-bit data frame format
  89.         SPI1->CR1|=BIT(9);                //Bit 9                1: Software slave management enabled
  90.         SPI1->CR1|=4<<3;                        //5=101: fPCLK/64                        Baud rate control  100/64=1.56M 100/32=3.12M
  91.                                                                                                 //4=clk/32
  92.         SPI1->CR1|=BIT(2);                //1: Master configuration
  93.         SPI1->CR2|=BIT(2);                //SSOE
  94.        

  95.                 //a4=cs1,pe13,14,15=cs2,3,4
  96.         GPIOA->ODR|=BIT(4);
  97.         GPIOE->ODR|=BIT(13);
  98.         GPIOE->ODR|=BIT(14);
  99.         GPIOE->ODR|=BIT(15);

  100.         SPI1->CR1|=BIT(6);                //Bit 6                SPI enable

  101.         }
  102.         //配置定时器 控制最终目标温度
  103.         if(ReadCBit(20,9)){                        //位9机头电机运动功能           //200 180/c
  104.                 //todo:位9机头电机运动功能  换F4后删除
  105.         }
  106.    
  107.    
  108.             //6配置RS485串口 modbus

  109.                 //modbus 实现 位写入,位读取        位映射
  110.     //rs485与屏通信
  111.     //pa9 tx af7
  112.                 //pa10 rx af7                       
  113.                 GPIOA->MODER|=(2<<(9*2))|(2<<(10*2));                        //10: Alternate function mode
  114.                 GPIOA->AFR[1]|=(7<<(4*2))|        (7<<(4*1));                //af7
  115.                        
  116.                 RCC->APB2ENR|=BIT(4);       

  117.                 //100-000-000/16/115200=54.25347222222222
  118.                 //M=54        F=.25347222222222*16=4
  119.                 USART1->BRR=(54<<4)|4;
  120.                        
  121.                 USART1->CR1|=BIT(3);                //Bit 3 TE: Transmitter enable
  122.                 USART1->CR1|=BIT(2);                //Bit 2 RE: Receiver enable
  123.                 USART1->CR1|=BIT(5);                //接收中断开启                        ORE=1 or RXNE=1
  124.                        
  125.                 USART1->CR1|=BIT(13);                //Bit 13 UE: USART enable
  126.                        
  127. //                __NVIC_EnableIRQ(USART1_IRQn);
  128. //               
  129. //                NVIC->ISER[(((uint32_t)USART1_IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)USART1_IRQn) & 0x1FUL));
  130.                
  131.     NVIC_EnableIRQ(USART1_IRQn);
  132.    
  133.                
  134.         //x9接的是PD14,用于履带机的电机脉冲触发信号,约1-30秒触发一次
  135.         EXTI->IMR|=EXTI_IMR_MR14;
  136.         EXTI->FTSR|=EXTI_FTSR_TR14;                //1: Falling trigger enabled
  137.         RCC->APB2ENR|=RCC_APB2ENR_SYSCFGEN;
  138.         SYSCFG->EXTICR[3]|=        3<<8;                                        //0011: PD[x] pin
  139.         NVIC_EnableIRQ(EXTI15_10_IRQn);
  140.        
  141.         //看门狗
  142.         RCC->CSR|=RCC_CSR_LSION;                //时钟开启
  143.         while((RCC->CSR & RCC_CSR_LSIRDY)==0);                        //1: LSI RC oscillator ready
  144.         IWDG->KR=0x5555;                //启用寄存器可写
  145.         IWDG->PR=2;                                        //0=32k/4*4096=0.5秒                1=/8=1秒                2=/16=2秒
  146.         while((IWDG->SR&IWDG_SR_PVU)==0);                //更新成功
  147.         IWDG->KR=0xCCCC;                //启动               
  148.         DOG();
  149.         //end



所有寄存器配置都是参照手册,一点点测试。
这样出现问题时比较好查找问题。
也能学习更多知识。
 楼主| fxyc87 发表于 2021-4-28 10:55 | 显示全部楼层
将外部8M晶振倍频到100M
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

119

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部