电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

stm32助学例程学习笔记二:例程3-13摘录总结

        这几天以来,一直是连续地学,舍不得花时间写东西了。现在学到助学例程13了,把其中重点的东西总结一下吧。

助学例程3:stm32定时器Tim3精确定时程序(外部高速晶振为8MHz,下同)-----重点是定时

 /**********************************************************************
* 名    称:TIM3_Configuration()
* 功    能:定时器3配置
* 入口参数:
* 出口参数:
-----------------------------------------------------------------------
* 说明:定时1ms
***********************************************************************/
 void TIM3_Configuration(void)
 {
  TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
 
  TIM_TimeBaseStructure.TIM_Prescaler = 1;                     //2分频 16M
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //计数模式
  TIM_TimeBaseStructure.TIM_Period = 16000;                    //自动装载,周期为1ms
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);                //使能中断源
  TIM_Cmd(TIM3, ENABLE);                      //使能外设
  }

助学例程4:stm32IO口输入程序-------重点是引脚电平读取                 

temp=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2);   //读取PA2                          GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)此函数在stm32f10x_gpio.c里

助学例程6-STM32 USART1异步串口发送数据例程(查询方式)------重点是发送数据和检测结束标志

  USART_SendData(USART1,(uint8)2);                                  //发送数据
  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}  ; //等待数据发送

助学例程7-USART1 串口接收程序(查询方式)-------接收数据函数的调用

  if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET) // 等待接收数据
   {                  
     dat = USART_ReceiveData(USART1);
  USART_SendData(USART1,(uint8)dat);              //发送数据
  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}  ; //等待数据发送
    }

助学例程8-stm32 USART2 串口发送程序(查询方式)-----同例程6                                                               助学例程9-stm32 USART1串口发送程序(中断方式)------同例程7

助学例程10-STM32 USART1 接收程序(中断方式)-------与例程7差不多,只是将while(1)里的循环体往串口中断处理程序移动了。

助学例程11- STM32 PWM实验------重要设置:自动重装载值,基波宽度,脉冲宽度。(在TIM1_Configuration)

/**********************************************************************
* 名    称:TIM1_Configuration()
* 功    能: 定时器1配置
* 接口参数:
* 全局变量:
-----------------------------------------------------------------------
* 说明:配置为PWM输出模式,输出引脚PA8,互补输出到PB13
***********************************************************************/
void  TIM1_Configuration(void)
{
  TIM1_TimeBaseInitTypeDef  TIM1_TimeBaseStructure;
  TIM1_OCInitTypeDef        TIM1_OCInitStructure;

  TIM1_DeInit();

  TIM1_TimeBaseStructure.TIM1_Prescaler = 0x0;      //时钟预分频得CK_INT时钟提供给计数器  APB2时钟/(n+1)  n=1~65536
  TIM1_TimeBaseStructure.TIM1_CounterMode = TIM1_CounterMode_Up; //向上计数模式
  TIM1_TimeBaseStructure.TIM1_Period = 0xffff;      //自动重装载值
  TIM1_TimeBaseStructure.TIM1_ClockDivision = TIM1_CKD_DIV1;  //时钟倍频因子,输出时钟供给死区发生器等
  TIM1_TimeBaseStructure.TIM1_RepetitionCounter = 0x00;    //周期计数器值 0~255
  TIM1_TimeBaseInit(&TIM1_TimeBaseStructure);      //初始化

  TIM1_OCInitStructure.TIM1_OCMode       = TIM1_OCMode_PWM2;       //PWM2模式
  TIM1_OCInitStructure.TIM1_OutputState  = TIM1_OutputState_Enable;  //信号输出到对应的输出引脚
  TIM1_OCInitStructure.TIM1_OutputNState = TIM1_OutputNState_Enable; //互补信号输出到对应的输出引脚                
  TIM1_OCInitStructure.TIM1_Pulse = 0;          //脉冲宽度
  TIM1_OCInitStructure.TIM1_OCPolarity   = TIM1_OCNPolarity_High;   //互补输出高电平有效
  TIM1_OCInitStructure.TIM1_OCNPolarity  = TIM1_OCNPolarity_High;    //互补输出高电平有效    
  TIM1_OCInitStructure.TIM1_OCIdleState  = TIM1_OCIdleState_Set;  //输出空闲状态为1
  TIM1_OCInitStructure.TIM1_OCNIdleState = TIM1_OCIdleState_Reset;   //互补输出空闲状态为0      
 
  TIM1_OC1Init(&TIM1_OCInitStructure);          //OC1通道初始化

  TIM1_Cmd(ENABLE);            //使能定时器1

  TIM1_CtrlPWMOutputs(ENABLE); //使能PWM输出
}

/**********************************************************************
* 名    称:PWMSet()
* 功    能: 设置PWM基波宽度,占空比
* 接口参数:base_wide 基波宽度
            pulse_wide 脉冲宽度
* 全局变量:
-----------------------------------------------------------------------
* 说明:
***********************************************************************/
void PWMSet(uint16  base_wide,uint16 pulse_wide)
{
  TIM1_SetAutoreload(base_wide);
  TIM1_SetCompare1(pulse_wide);
}                                                                                                                                                                                  while(1)                         //循环体设置占空比不停地在变化
 {
  Delay(100);       //延时
  if (dat<0xfe0) dat=dat+20;   //延时一定时间脉冲宽度+20
  else  dat=0;

  PWMSet(0xfff,dat);    //设置占空比
  }

助学例程12-STM32进入停止模式并唤醒-----停止模式的进入以及中断唤醒

PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//进入停止模式

助学例程13-STM32 Flash模拟EEPROM 存储数据例程------重点是过程:解锁->擦除->写半字->上锁

void SavePara(uint32 addr,uint16 data)
{
  FLASH_Unlock();          //每次擦除Flash中数据时得先解锁
  FLASH_ErasePage(ADDR_BASE);      //擦除页
  FLASH_ProgramHalfWord(addr,data);//写16位半字
  FLASH_Lock();           //上锁                                                                                                                                   

}

*****************************************************************************************************/
uint16 GetPara(uint32 addr)
{
   uint16 data;
   data=(uint16)(*(uint32*)addr); //读取相应地址中的16位数据
   return data;
}                   //  读取是可以直接读出来的

        都是固件库函数的运用,在这里只是理一下思路而已,免得以后去具体例程寻找思路。易记之!

博主
richie.liu@msn.com
richie1986's Blog
richie1986
点击跳转