目录
修改主频:
(system_stm32f10x.h)
SystemCoreClock(显示当前时钟频率)
代码示例
修改主频
主函数
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
int main(void)
{
OLED_Init(); //OLED初始化
OLED_ShowString(1, 1, "SYSCLK:"); //显示静态字符串
OLED_ShowNum(1, 8, SystemCoreClock, 8); //显示SystemCoreClock变量
//SystemCoreClock的值表示当前的系统主频频率
while (1)
{
OLED_ShowString(2, 1, "Running"); //闪烁Running,指示当前主循环运行的快慢
Delay_ms(500);
OLED_ShowString(2, 1, " ");
Delay_ms(500);
}
}
睡眠模式:
__WFI();(进入睡眠模式,可被任意一个NVIC响应的中断唤醒)
__WFE();(进入睡眠模式,可被唤醒事件唤醒)
代码示例
睡眠模式+串口发送+接收
只写主函数代码 .C文件 .h文件在对应的模块中
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
uint8_t RxData; //定义用于接收串口数据的变量
int main(void)
{
OLED_Init(); //OLED初始化
OLED_ShowString(1, 1, "RxData:"); //显示静态字符串
Serial_Init(); //串口初始化
while (1)
{
if (Serial_GetRxFlag() == 1) //检查串口接收数据的标志位
{
RxData = Serial_GetRxData(); //获取串口接收的数据
Serial_SendByte(RxData); //串口将收到的数据回传回去,用于测试
OLED_ShowHexNum(1, 8, RxData, 2); //显示串口接收的数据
}
OLED_ShowString(2, 1, "Running"); //OLED闪烁Running,指示当前主循环正在运行
Delay_ms(100);
OLED_ShowString(2, 1, " ");
Delay_ms(100);
__WFI(); //执行WFI指令,CPU睡眠,并等待中断唤醒
}
}
停止模式:
1.RCC开启时钟(PWR)
(rcc.h文件)
RCC_AHBPeriphClockCmd(); AHB对应的外设
RCC_APB1PeriphClockCmd(); APB1对应的外设
RCC_APB2PeriphClockCmd(); APB2对应的外设
2.主循环调用进入停止模式函数
PWR_EnterSTOPMode();(进入停止模式)
3.退出停止模式后 HSI被选为系统时钟 更改时钟
SystemInit();(将时钟更改为HSE)
代码示例
停止模式+ 对射式红外传感器计次
只写主函数代码 .C文件 .h文件在对应的模块中
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"
int main(void)
{
/*模块初始化*/
OLED_Init(); //OLED初始化
CountSensor_Init(); //计数传感器初始化
/*开启时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //开启PWR的时钟
//停止模式和待机模式一定要记得开启
/*显示静态字符串*/
OLED_ShowString(1, 1, "Count:");
while (1)
{
OLED_ShowNum(1, 7, CountSensor_Get(), 5); //OLED不断刷新显示CountSensor_Get的返回值
OLED_ShowString(2, 1, "Running"); //OLED闪烁Running,指示当前主循环正在运行
Delay_ms(100);
OLED_ShowString(2, 1, " ");
Delay_ms(100);
PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI); //STM32进入停止模式,并等待中断唤醒
SystemInit(); //唤醒后,要重新配置时钟
}
}
待机模式:
1.RCC开启时钟(PWR)
(rcc.h文件)
RCC_AHBPeriphClockCmd(); AHB对应的外设
RCC_APB1PeriphClockCmd(); APB1对应的外设
RCC_APB2PeriphClockCmd(); APB2对应的外设
2.设置闹钟
RTC_SetAlarm();(设置闹钟函数 时间戳+多少秒之后开启闹钟)
闹钟只能写不能读 可以通过变量来接收设置的闹钟值
3.主循环中显示闹钟标志位查看是否为1(为1表示闹钟开启)
RTC_GetFlagStatus();(查看闹钟标志位)
4.主循环中开启待机模式
PWR_EnterSTANDBYMode();(进入待机模式)
PWR_WakeUpPinCmd();(使能位于PA0位置的WKUP引脚,配合待机模式使用,唤醒时钟的另一个方法)
代码示例
待机模式+实时时钟
只写主函数代码 .C文件 .h文件在对应的模块中
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyRTC.h"
int main(void)
{
/*模块初始化*/
OLED_Init(); //OLED初始化
MyRTC_Init(); //RTC初始化
/*开启时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //开启PWR的时钟
//停止模式和待机模式一定要记得开启
/*显示静态字符串*/
OLED_ShowString(1, 1, "CNT :");
OLED_ShowString(2, 1, "ALR :");
OLED_ShowString(3, 1, "ALRF:");
/*使能WKUP引脚*/
PWR_WakeUpPinCmd(ENABLE); //使能位于PA0的WKUP引脚,WKUP引脚上升沿唤醒待机模式
/*设定闹钟*/
uint32_t Alarm = RTC_GetCounter() + 10; //闹钟为唤醒后当前时间的后10s
RTC_SetAlarm(Alarm); //写入闹钟值到RTC的ALR寄存器
OLED_ShowNum(2, 6, Alarm, 10); //显示闹钟值
while (1)
{
OLED_ShowNum(1, 6, RTC_GetCounter(), 10); //显示32位的秒计数器
OLED_ShowNum(3, 6, RTC_GetFlagStatus(RTC_FLAG_ALR), 1); //显示闹钟标志位
OLED_ShowString(4, 1, "Running"); //OLED闪烁Running,指示当前主循环正在运行
Delay_ms(100);
OLED_ShowString(4, 1, " ");
Delay_ms(100);
OLED_ShowString(4, 9, "STANDBY"); //OLED闪烁STANDBY,指示即将进入待机模式
Delay_ms(1000);
OLED_ShowString(4, 9, " ");
Delay_ms(100);
OLED_Clear(); //OLED清屏,模拟关闭外部所有的耗电设备,以达到极度省电
PWR_EnterSTANDBYMode(); //STM32进入停止模式,并等待指定的唤醒事件(WKUP上升沿或RTC闹钟)
/*待机模式唤醒后,程序会重头开始运行*/
}
}