LORA模块开发基础教程目录
- 物联网国赛LORA模块开发基础教程—开发环境配置
- 物联网国赛LORA模块开发基础教程—输出(LED)
- 物联网国赛LORA模块开发基础教程—输入(按键)
- 物联网国赛LORA模块开发基础教程—OLED屏幕
- 物联网国赛LORA模块开发基础教程—传感器
- 物联网国赛LORA模块开发基础教程—定时器
- 物联网国赛LORA模块开发基础教程—串口收发
- 物联网国赛LORA模块开发基础教程—读写内部FALSH
- 物联网国赛LORA模块开发基础教程—点对点通信
物联网国赛LORA模块开发基础教程(通用库)—定时器
1.本节内容
- 定时器2
- 定时器3
- 滴答定时器
2.本节函数
//定时器2
setTimer2Callback(Time2Handler);
Tim2McuInit(1);//定时器2初始化,设置定时中断1ms中断一次
Tim2McuInit(0);//关闭定时器2
//定时器2
setTimer2Callback(Time3Handler);
Tim3McuInit(1);//定时器3初始化,设置定时中断1ms中断一次
//滴答定时器
void SysTick_Handler( void ) //滴答定时器,1ms中断一次
{
HAL_IncTick( );
HAL_SYSTICK_IRQHandler( );
}
3.本节代码
main.c(定时器2、定时器3在此源代码文件初始化)
/**
******************************************************************************
* File Name : main.c
* Description : Main program body
******************************************************************************
*/
#include <string.h>
#include "board.h"
#include "hal_key.h"
#include "tim-board.h"
#include "timer_handles.h"
/**********************************************************************************************
*函数:void Init( void )
*功能:平台初始化
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void Init() {
// 开发板平台初始化
BoardInitMcu();
BoardInitPeriph();
keys_init();//按键初始化
setTimer2Callback(Time2Handler);
Tim2McuInit(1);//定时器初始化,单位:1ms,所以参数设置1时,定时中断1ms中断一次
setTimer3Callback(Time3Handler);
Tim3McuInit(4);//定时器初始化,单位:0.25ms,所以参数设置为4时,定时中断1ms中断一次
}
/**********************************************************************************************
*函数:void KeyDownHandler( void )
*功能:按钮事件监听
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void KeyDownHandler(void) {
}
/**********************************************************************************************
*函数:void handlerPre10Ms( void )
*功能:10毫秒循环
*输入:无
*输出:无
*特殊说明:循环处理总时长300ms
**********************************************************************************************/
void handlerPre10Ms(void) {
for (int delay = 0; delay < 30; delay++) {
HAL_Delay(10);
}
}
/**
* Main application entry point.
*/
int main( void )
{
Init();
while( 1 )
{
}
}
timer_handles.c(定时器2、定时器3在此源代码文件使用)
/* Includes ------------------------------------------------------------------*/
#include "timer_handles.h"
#include "key_scaner.h"
uint16_t Time2_Time = 1000;
uint16_t Time3_Time = 1000;
void Time2Handler(){
keyScanner();
if(!Time2_Time--)
{
Time2_Time = 1000;
GpioToggle(&Led1);
}
}
void Time3Handler(){
if(!Time3_Time--)
{
Time3_Time = 1000;
GpioToggle(&Led2);
}
}
board.c(滴答定时器在此源代码文件使用)
/*
/ _____) _ | |
( (____ _____ ____ _| |_ _____ ____| |__
\____ \| ___ | (_ _) ___ |/ ___) _ \
_____) ) ____| | | || |_| ____( (___| | | |
(______/|_____)_|_|_| \__)_____)\____)_| |_|
(C)2013 Semtech
Description: Target board general functions implementation
License: Revised BSD License, see LICENSE.TXT file include in the project
Maintainer: Miguel Luis and Gregory Cristian
*/
#include "board.h"
/*!
* Unique Devices IDs register set ( STM32L1xxx )
*/
#define ID1 ( 0x1FF80050 )
#define ID2 ( 0x1FF80054 )
#define ID3 ( 0x1FF80064 )
/*!
* LED GPIO pins objects
*/
Gpio_t Led1;
Gpio_t Led2;
Gpio_t Key2;
/*
* MCU objects
*/
Adc_t Adc;
Uart_t Uart1;
#if defined( USE_USB_CDC )
Uart_t UartUsb;
#endif
/*!
* Initializes the unused GPIO to a know status
*/
static void BoardUnusedIoInit( void );
/*!
* System Clock Configuration
*/
static void SystemClockConfig( void );
/*!
* Used to measure and calibrate the system wake-up time from STOP mode
*/
static void CalibrateSystemWakeupTime( void );
/*!
* System Clock Re-Configuration when waking up from STOP mode
*/
static void SystemClockReConfig( void );
/*!
* Timer used at first boot to calibrate the SystemWakeupTime
*/
static TimerEvent_t CalibrateSystemWakeupTimeTimer;
/*!
* Flag to indicate if the MCU is Initialized
*/
static bool McuInitialized = false;
/*!
* Flag to indicate if the SystemWakeupTime is Calibrated
*/
static bool SystemWakeupTimeCalibrated = false;
/*!
* Callback indicating the end of the system wake-up time calibration
*/
static void OnCalibrateSystemWakeupTimeTimerEvent( void )
{
SystemWakeupTimeCalibrated = true;
}
/*!
* Nested interrupt counter.
*
* \remark Interrupt should only be fully disabled once the value is 0
*/
static uint8_t IrqNestLevel = 0;
void BoardDisableIrq( void )
{
__disable_irq( );
IrqNestLevel++;
}
void BoardEnableIrq( void )
{
IrqNestLevel--;
if( IrqNestLevel == 0 )
{
__enable_irq( );
}
}
void BoardInitPeriph( void )
{
GpioInit( &Led1, LED_1, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
GpioInit( &Led2, LED_2, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
GpioInit( &Key2, KEY_2, PIN_INPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
// Switch LED 1, 2 OFF
GpioWrite( &Led1, 1 );
GpioWrite( &Led2, 1 );
GpioWrite( &Key2, 1 );
}
void BoardInitMcu( void )
{
if( McuInitialized == false )
{
#if defined( USE_BOOTLOADER )
// Set the Vector Table base location at 0x3000
SCB->VTOR = FLASH_BASE | 0x3000;
#endif
HAL_Init( );
SystemClockConfig( );
#if defined( USE_USB_CDC )
UartInit( &UartUsb, UART_USB_CDC, NC, NC );
UartConfig( &UartUsb, RX_TX, 115200, UART_8_BIT, UART_1_STOP_BIT, NO_PARITY, NO_FLOW_CTRL );
DelayMs( 1000 ); // 1000 ms for Usb initialization
#endif
RtcInit( );
BoardUnusedIoInit( );
}
else
{
SystemClockReConfig( );
}
SpiInit( &SX1276.Spi, RADIO_MOSI, RADIO_MISO, RADIO_SCLK, NC );
SX1276IoInit( );
if( McuInitialized == false )
{
McuInitialized = true;
if( GetBoardPowerSource( ) == BATTERY_POWER )
{
CalibrateSystemWakeupTime( );
}
}
}
void BoardDeInitMcu( void )
{
Gpio_t ioPin;
AdcDeInit( &Adc );
SpiDeInit( &SX1276.Spi );
SX1276IoDeInit( );
GpioInit( &ioPin, OSC_HSE_IN, PIN_ANALOGIC, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
GpioInit( &ioPin, OSC_HSE_OUT, PIN_ANALOGIC, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
GpioInit( &ioPin, OSC_LSE_IN, PIN_INPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
GpioInit( &ioPin, OSC_LSE_OUT, PIN_INPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
}
uint32_t BoardGetRandomSeed( void )
{
return ( ( *( uint32_t* )ID1 ) ^ ( *( uint32_t* )ID2 ) ^ ( *( uint32_t* )ID3 ) );
}
void BoardGetUniqueId( uint8_t *id )
{
id[7] = ( ( *( uint32_t* )ID1 )+ ( *( uint32_t* )ID3 ) ) >> 24;
id[6] = ( ( *( uint32_t* )ID1 )+ ( *( uint32_t* )ID3 ) ) >> 16;
id[5] = ( ( *( uint32_t* )ID1 )+ ( *( uint32_t* )ID3 ) ) >> 8;
id[4] = ( ( *( uint32_t* )ID1 )+ ( *( uint32_t* )ID3 ) );
id[3] = ( ( *( uint32_t* )ID2 ) ) >> 24;
id[2] = ( ( *( uint32_t* )ID2 ) ) >> 16;
id[1] = ( ( *( uint32_t* )ID2 ) ) >> 8;
id[0] = ( ( *( uint32_t* )ID2 ) );
}
/*!
* Factory power supply
*/
#define FACTORY_POWER_SUPPLY 3300 // mV
/*!
* VREF calibration value
*/
#define VREFINT_CAL ( *( uint16_t* )0x1FF80078 )
/*!
* ADC maximum value
*/
#define ADC_MAX_VALUE 4095
/*!
* Battery thresholds
*/
#define BATTERY_MAX_LEVEL 4150 // mV
#define BATTERY_MIN_LEVEL 3200 // mV
#define BATTERY_SHUTDOWN_LEVEL 3100 // mV
static uint16_t BatteryVoltage = BATTERY_MAX_LEVEL;
uint16_t BoardBatteryMeasureVolage( void )
{
return BATTERY_MAX_LEVEL;
}
uint32_t BoardGetBatteryVoltage( void )
{
return BatteryVoltage;
}
uint8_t BoardGetBatteryLevel( void )
{
uint8_t batteryLevel = 0;
BatteryVoltage = BoardBatteryMeasureVolage( );
if( GetBoardPowerSource( ) == USB_POWER )
{
batteryLevel = 0;
}
else
{
if( BatteryVoltage >= BATTERY_MAX_LEVEL )
{
batteryLevel = 254;
}
else if( ( BatteryVoltage > BATTERY_MIN_LEVEL ) && ( BatteryVoltage < BATTERY_MAX_LEVEL ) )
{
batteryLevel = ( ( 253 * ( BatteryVoltage - BATTERY_MIN_LEVEL ) ) / ( BATTERY_MAX_LEVEL - BATTERY_MIN_LEVEL ) ) + 1;
}
else if( ( BatteryVoltage > BATTERY_SHUTDOWN_LEVEL ) && ( BatteryVoltage <= BATTERY_MIN_LEVEL ) )
{
batteryLevel = 1;
}
else //if( BatteryVoltage <= BATTERY_SHUTDOWN_LEVEL )
{
batteryLevel = 255;
//GpioInit( &DcDcEnable, DC_DC_EN, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
//GpioInit( &BoardPowerDown, BOARD_POWER_DOWN, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 1 );
}
}
return batteryLevel;
}
static void BoardUnusedIoInit( void )
{
Gpio_t ioPin;
if( GetBoardPowerSource( ) == BATTERY_POWER )
{
GpioInit( &ioPin, USB_DM, PIN_ANALOGIC, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
GpioInit( &ioPin, USB_DP, PIN_ANALOGIC, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
}
GpioInit( &ioPin, BOOT_1, PIN_ANALOGIC, PIN_OPEN_DRAIN, PIN_NO_PULL, 0 );
GpioInit( &ioPin, WKUP1, PIN_ANALOGIC, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
#if defined( USE_DEBUGGER )
HAL_DBGMCU_EnableDBGStopMode( );
HAL_DBGMCU_EnableDBGSleepMode( );
HAL_DBGMCU_EnableDBGStandbyMode( );
#else
HAL_DBGMCU_DisableDBGSleepMode( );
HAL_DBGMCU_DisableDBGStopMode( );
HAL_DBGMCU_DisableDBGStandbyMode( );
GpioInit( &ioPin, SWDIO, PIN_ANALOGIC, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
GpioInit( &ioPin, SWCLK, PIN_ANALOGIC, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
#endif
}
void SystemClockConfig( void )
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInit;
__HAL_RCC_PWR_CLK_ENABLE( );
__HAL_PWR_VOLTAGESCALING_CONFIG( PWR_REGULATOR_VOLTAGE_SCALE1 );
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL8;
//RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV3;//官方原版配置:外部晶振12MHZ,SystemCoreClock = 12000000*8/3 =32000000HZ;
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV2;//新大陆LORA模块上的配置:外部晶振8MHZ,SystemCoreClock = 8000000*8/2 =32000000HZ;
if( HAL_RCC_OscConfig( &RCC_OscInitStruct ) != HAL_OK )
{
assert_param( FAIL );
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |
RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if( HAL_RCC_ClockConfig( &RCC_ClkInitStruct, FLASH_LATENCY_1 ) != HAL_OK )
{
assert_param( FAIL );
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
if( HAL_RCCEx_PeriphCLKConfig( &PeriphClkInit ) != HAL_OK )
{
assert_param( FAIL );
}
HAL_SYSTICK_Config( HAL_RCC_GetHCLKFreq( ) / 1000 );
HAL_SYSTICK_CLKSourceConfig( SYSTICK_CLKSOURCE_HCLK );
// HAL_NVIC_GetPriorityGrouping
HAL_NVIC_SetPriorityGrouping( NVIC_PRIORITYGROUP_4 );
// SysTick_IRQn interrupt configuration
HAL_NVIC_SetPriority( SysTick_IRQn, 0, 0 );
}
void CalibrateSystemWakeupTime( void )
{
if( SystemWakeupTimeCalibrated == false )
{
TimerInit( &CalibrateSystemWakeupTimeTimer, OnCalibrateSystemWakeupTimeTimerEvent );
TimerSetValue( &CalibrateSystemWakeupTimeTimer, 1000 );
TimerStart( &CalibrateSystemWakeupTimeTimer );
while( SystemWakeupTimeCalibrated == false )
{
TimerLowPowerHandler( );
}
}
}
void SystemClockReConfig( void )
{
__HAL_RCC_PWR_CLK_ENABLE( );
__HAL_PWR_VOLTAGESCALING_CONFIG( PWR_REGULATOR_VOLTAGE_SCALE1 );
/* Enable HSE */
__HAL_RCC_HSE_CONFIG( RCC_HSE_ON );
/* Wait till HSE is ready */
while( __HAL_RCC_GET_FLAG( RCC_FLAG_HSERDY ) == RESET )
{
}
/* Enable PLL */
__HAL_RCC_PLL_ENABLE( );
/* Wait till PLL is ready */
while( __HAL_RCC_GET_FLAG( RCC_FLAG_PLLRDY ) == RESET )
{
}
/* Select PLL as system clock source */
__HAL_RCC_SYSCLK_CONFIG ( RCC_SYSCLKSOURCE_PLLCLK );
/* Wait till PLL is used as system clock source */
while( __HAL_RCC_GET_SYSCLK_SOURCE( ) != RCC_SYSCLKSOURCE_STATUS_PLLCLK )
{
}
}
uint16_t SysTick_Time = 1000;
void SysTick_Handler( void ) //滴答定时器,1ms中断一次
{
//选手在此添加代码
if(!SysTick_Time--) //1S周期改变LED1状态
{
SysTick_Time = 1000;
// GpioToggle(&Led1);
}
HAL_IncTick( );
HAL_SYSTICK_IRQHandler( );
}
uint8_t GetBoardPowerSource( void )
#if (USE_BATTERY != false)
{
return BATTERY_POWER;//电池供电
}
#else
{
return USB_POWER;//USB供电
}
#endif /*(USE_BATTERY != false)*/
#ifdef USE_FULL_ASSERT
/*
* Function Name : assert_failed
* Description : Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* Input : - file: pointer to the source file name
* - line: assert_param error line source number
* Output : None
* Return : None
*/
void assert_failed( uint8_t* file, uint32_t line )
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while( 1 )
{
}
}
#endif
4.实验效果
- 定时器2
- 定时器3
- 滴答定时器
5.本节相关知识
切忌:定时器里千万千万不要写延时函数
6.本节资源
百度网盘: 本节源码