代码总结

1.位绑定宏定义公式

//位绑定公式  位屏蔽
  #define BitBand(Addr,BitNum)  *( (volatile u32 *) ( (Addr&0xF0000000)+0x02000000+(Addr&0x000FFFFF)*32+ (BitNum*4)) )


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

自己总结的实验目的
一.入门:学会GPIO的控制:设置输入输出(复用),输入输出高低电平

二 基础
18:USART寄存器的通信方式编程:目的理解uart引脚,接发原理和协议。(注意打开时钟和GPIO复用)
27 理解概念:复用,重映射。
30系统时钟systick
32->38:数码管原理和spi/iic接口,spi的实验可以用原子的来代替。(spi和iic对比学习)


40/41中断的基本概念,STM32的中断机制NVIC(意义:快),学习外部中断编程
45/46如何使用 STM32 的 TIM3 来产生 PWM 输出
掌握DMA编程,(学会对EPC02的读写操作),学习双缓冲兵乓操作,理解互斥资源。
ADC DAC 
485 (原子视频有)


三 、高级
can总线,SD卡和SDIO接口


其他:19,20掌握USART库函数编程的相关函数。
     21printf重定向,本质是重写fputc.
     26掌握GPIO库函数的使用。
     28是为了更加深入理解重映射。
     29版权保护
     42/43掌握定时器中断,学会对定时器中断的编程操作。
     49/50实时时钟
     独立/窗口看门狗


------------------------------------------------------------------规律性代码---------------------------------------------------------------------------------------------------------------



***通过初始化结构体初始化 GPIO 的常用格式*****************************************************************
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);//根据设定参数配置 GPIO




***************USART一般的实现格式****************************************
USART_InitStructure.USART_BaudRate = bound; //一般设置为 9600;
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); //初始化串口


数据发送与接收:
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);


读取串口状态的函数:FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
使能串口:   USART_Cmd(USART1, ENABLE); 
开启串口响应中断:void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,
FunctionalState NewState)
获取相应中断状态:ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)




****************************I2C初始化(来自网上)*****************************************
I2C_InitTypeDef I2C_InitStructure;  
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;  //配置为I2C模式

I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;  //该参数只有在I2C 工作在快速模式(时钟工作频率高于 100KHz)下才有意义
I2C_InitStructure.I2C_OwnAddress1 = I2C1_ADDRESS;  //设置第一个设备自身地址
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;  //使能应答
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;  // 外围器件地址是多少位就设置多少位
I2C_InitStructure.I2C_ClockSpeed = 200000;  //时钟速率
I2C_Init(I2C1,&I2C_InitStructure); //I2C1 初始化
 
I2C_ITConfig(I2C1,I2C_IT_EVT|I2C_IT_BUF,ENABLE);  
  
I2C_Cmd(I2C1,ENABLE);  



*******************初始化 SPI 外设****************************************
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主 SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // SPI 发送接收 8 位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//串行同步时钟的空闲状态为高电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//第二个跳变沿数据被采样
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS 信号由软件控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //预分频 256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从 MSB 位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC 值计算的多项式
SPI_Init(SPI2, &SPI_InitStructure); //根据指定的参数初始化外设 SPIx 寄存器
SPI_Cmd(SPI2, ENABLE); //使能 SPI 外设
传输数据:void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);
uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx) ;


查看 SPI 传输状态:SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE);


**********************RS485(半双工模式)*****************
//RS485 发送 len 个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过 64 个字节)
void RS485_Send_Data(u8 *buf,u8 len)
{
    u8 t;
RS485_TX_EN=1; //设置为发送模式
  for(t=0;t<len;t++) //循环发送数据
  {
    while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
    USART_SendData(USART2,buf[t]);
  }
  while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
  RS485_RX_CNT=0;
   RS485_TX_EN=0; //设置为接收模式
}




//RS485 查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_Receive_Data(u8 *buf,u8 *len)
{
   u8 rxlen=RS485_RX_CNT;
   u8 i=0;
   *len=0; //默认为 0
   delay_ms(10); //等待 10ms,连续超过 10ms 没有接收到一个数据,则认为接收结束
   if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
   {
     for(i=0;i<rxlen;i++)
     {
       buf[i]=RS485_RX_BUF[i];
     }
     *len=RS485_RX_CNT; //记录本次数据长度
     RS485_RX_CNT=0; //清零
   }
}


******************通过初始化结构体初始化CAN的常用格式************
CAN_InitStructure.CAN_TTCM=DISABLE; //非时间触发通信模式
CAN_InitStructure.CAN_ABOM=DISABLE; //软件自动离线管理
CAN_InitStructure.CAN_AWUM=DISABLE; //睡眠模式通过软件唤醒
CAN_InitStructure.CAN_NART=ENABLE; //禁止报文自动传送
CAN_InitStructure.CAN_RFLM=DISABLE; //报文不锁定,新的覆盖旧的
CAN_InitStructure.CAN_TXFP=DISABLE; //优先级由报文标识符决定
CAN_InitStructure.CAN_Mode= CAN_Mode_LoopBack; //模式设置: 1,回环模式;
//设置波特率
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳跃宽度为个时间单位
CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; //时间段 1 占用 8 个时间单位
CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;//时间段 2 占用 7 个时间单位
CAN_InitStructure.CAN_Prescaler=5; //分频系数(Fdiv)
CAN_Init(CAN1, &CAN_InitStructure); // 初始化 CAN1


设置滤波器:
CAN_FilterInitStructure.CAN_FilterNumber=0; //过滤器 0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32 位
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;32 位 ID
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32 位 MASK
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;// FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器 0
CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化


送接受消息:
uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage);
void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage);
CAN 状态获取:
**********************看门狗初始化*********************************
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 时钟使能
WWDG_CNT=tr&WWDG_CNT; //初始化 WWDG_CNT.
WWDG_SetPrescaler(fprer); //设置 IWDG 预分频值
WWDG_SetWindowValue(wr); //设置窗口值
WWDG_Enable(WWDG_CNT); //使能看门狗,设置 counter
WWDG_ClearFlag(); //清除提前唤醒中断标志位
WWDG_NVIC_Init(); //初始化窗口看门狗 NVIC
WWDG_EnableIT(); //开启窗口看门狗中断
}


************************************中断*************************************************
配置 GPIO 与中断线的映射关系的函数:void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
中断线上中断的初始化:
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据 EXTI_InitStruct 中指定的参数初始化外设 EXTI 寄存器 


设置中断线 2 的中断优先级:
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按键外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //中断优先级分组初始化


判断某个中断线上的中断是否发生(标志位是否置位):ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
清除某个中断线上的中断标志位:void EXTI_ClearITPendingBit(uint32_t EXTI_Line);


中断服务函数:
void EXTI0_IRQHandler(void)是外部中断 0 的服务函数,负责 WK_UP 按键的中断检测;
void EXTI2_IRQHandler(void)是外部中断 2 的服务函数,负责 KEY2 按键的中断检测;
void EXTI3_IRQHandler(void)是外部中断 3 的服务函数,负责 KEY1 按键的中断检测;
void EXTI4_IRQHandler(void)是外部中断 4 的服务函数,负责 KEY0 按键的中断检测;


********************PWM(包括:TIM3 初始化和 初始化 TIM3 Channel2 PWM 模式)***********************************************************
//初始化 TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //设置在自动重装载周期值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //③初始化 TIMx
//初始化 TIM3 Channel2 PWM 模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //④初始化外设 TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能预装载寄存器
TIM_Cmd(TIM3, ENABLE); //⑤使能 TIM3




*************************设置 TIM5 的输入比较参数,开启输入捕获**********************
typedef struct
   {
       uint16_t TIM_Channel; //设置通道
       uint16_t TIM_ICPolarity; //设 置 输 入 信 号 的 有效 捕获 极性 
       uint16_t TIM_ICSelection; //设置映射关系
       uint16_t TIM_ICPrescaler; //设置 输入捕获分频系数
       uint16_t TIM_ICFilter; //设置滤波器长度
   } TIM_ICInitTypeDef;
   
TIM_ICInitTypeDef TIM5_ICInitStructure; 
   TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1 映射到 TI1 上
   TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
   TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到 TI1 上
   TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 
   TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
   TIM_ICInit(TIM5, &TIM5_ICInitStructure);


********************FSMC 初始化函数****************
FSMC_NORSRAMInitTypeDef;
FSMC_NORSRAMTimingInitTypeDef;
//LCD 操作结构体
typedef struct
{ u16 LCD_REG;
u16 LCD_RAM;
} LCD_TypeDef;


3 个 FSMC 初始化函数:
FSMC_NORSRAMInit();
FSMC_NANDInit();
FSMC_PCCARDInit();


FSMC 使能函数:
void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState);
void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState);
void FSMC_PCCARDCmd(FunctionalState NewState);


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


************


--
总结:
主要是理解原理+初始化的结构体

结构体初始化外设:xxx_InitTypeDef结构体 xxx_init()函数
使能函数ADC_Cmd(ADC1, ENABLE); //使能指定的 ADC1
使能外设总线 RCC_APBxPeriphClockCmd


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值