文章目錄
-
- 前言
- 設定滴答定時器搶占優先級為0
- 快速碼出LED驅動
- 使用序列槽發送中斷發送資料
- ADC快速配置
- RTC快速配置
前言
代碼量較大,本文隻介紹寫題目時使用的固件庫檔案及其修改。
下載下傳工程檔案:
https://gitee.com/Joseph_Cooper/blue-bridge-embedded
設定滴答定時器搶占優先級為0
快速碼出LED驅動
...\賽點資源資料包_嵌入式_2019\6-STM32固件庫代碼V3.5版\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\GPIO\IOToggle
void LEDCMD(BitAction BitVal)//Bit_RESET Bit_SET
{
GPIO_WriteBit(GPIOD,GPIO_Pin_2,BitVal);
}
//PD2 PC8~15
void LEDInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|
GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
LEDCMD(Bit_SET);
GPIO_Write(GPIOC,GPIO_ReadOutputData(GPIOC)| 0xFF00);
LEDCMD(Bit_RESET);
}
void LEDSetting(u8 Act,uint16_t Val)
{
LEDCMD(Bit_SET);
if(Act){
GPIO_Write(GPIOC,GPIO_ReadOutputData(GPIOC)&Val);
}else{
GPIO_Write(GPIOC,GPIO_ReadOutputData(GPIOC)|Val);
}
LEDCMD(Bit_RESET);
}
使用序列槽發送中斷發送資料
...\賽點資源資料包_嵌入式_2019\6-STM32固件庫代碼V3.5版\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\USART\Interrupt
/* Private define ------------------------------------------------------------*/
#define TxBufferSize1 (countof(TxBuffer1) - 1)
#define RxBufferSize1 TxBufferSize2
/* Private macro -------------------------------------------------------------*/
#define countof(a) (sizeof(a) / sizeof(*(a)))
USART_InitTypeDef USART_InitStructure;
uint8_t TxBuffer1[] = "Hello World!\r\n";
uint8_t RxBuffer1[255];
__IO uint8_t TxCounter1 = 0x00;
__IO uint8_t RxCounter1 = 0x00;
uint8_t NbrOfDataToTransfer1 = TxBufferSize1;
uint8_t NbrOfDataToRead1 = 255;
u8 TxReady = 1;
void USARTInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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(USART2, &USART_InitStructure);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
USART_Cmd(USART2, ENABLE);
}
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
/* Read one byte from the receive data register */
RxBuffer1[RxCounter1++] = USART_ReceiveData(USART2);
if(RxCounter1 == NbrOfDataToRead1)
{
/* Disable the USARTy Receive interrupt */
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
}
}
if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)
{
/* Write one byte to the transmit data register */
USART_SendData(USART2, TxBuffer1[TxCounter1++]);
if(TxCounter1 == NbrOfDataToTransfer1)
{
/* Disable the USARTy Transmit interrupt */
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
TxReady = 1;
}
}
}
//序列槽發送中斷發送資料
void USART2_SendString()
{
while(TxReady == 0);//等待上一次發送完畢
NbrOfDataToTransfer1 = TxBufferSize1;//更新緩沖區資料長度
TxCounter1 = 0;//清空發送索引
TxReady = 0;//清空發送完成标志位
//一定要在中斷打開之前對變量完成操作
USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
}
ADC快速配置
...\賽點資源資料包_嵌入式_2019\6-STM32固件庫代碼V3.5版\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\ADC\ADC1_DMA
#include "stm32f10x.h"
__IO uint16_t ADCConvertedValue;
void ADC1Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //改成6分頻
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1
| RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
//改成239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
u16 AD_Get()
{
u16 Temp = 0;
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
Temp = ADC_GetConversionValue(ADC1);
ADC_SoftwareStartConvCmd(ADC1, DISABLE);
return Temp;
}
RTC快速配置
...\賽點資源資料包_嵌入式_2019\6-STM32固件庫代碼V3.5版\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\RTC\LSI_Calib
一定要删除固件庫檔案裡的RTC配置的BKP相關代碼!!!
#include "stm32f10x.h"
#include "Stdio.h"
#include "lcd.h"
u8 HH = 23,MM = 59,SS = 55;
u8 Hour = 0, Min = 0, Sec = 0;
u32 Time = 0;
extern u8 Str[];
void RTCInit()
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable the RTC Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable PWR and BKP clocks */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
/* Reset Backup Domain */
BKP_DeInit();
/* Enable the LSI OSC */
RCC_LSICmd(ENABLE);
/* Wait till LSI is ready */
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
/* Select the RTC Clock Source */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
/* Enable RTC Clock */
RCC_RTCCLKCmd(ENABLE);
/* Wait for RTC registers synchronization */
RTC_WaitForSynchro();
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Enable the RTC Second */
RTC_ITConfig(RTC_IT_SEC, ENABLE);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Set RTC prescaler: set RTC period to 1sec */
RTC_SetPrescaler(40000);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* To output second signal on Tamper pin, the tamper functionality
must be disabled (by default this functionality is disabled) */
/* Enable the RTC Second Output on Tamper Pin */
RTC_SetCounter(HH * 3600 + MM * 60 + SS);//設定RTC時間
RTC_WaitForLastTask();
}
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
{
Time = RTC_GetCounter();
RTC_WaitForLastTask();
if(Time == (23*3600 + 59*60 + 59))
{
RTC_SetCounter(0);
RTC_WaitForLastTask();
}
Hour = Time/3600;
Min = (Time % 3600) / 60;
Sec = Time % 60;
sprintf((char *)Str,"%.2d:%.2d:%.2d",Hour,Min,Sec);
LCD_DisplayStringLine(Line5,Str);
/* Clear Interrupt pending bit */
RTC_ClearITPendingBit(RTC_FLAG_SEC);
}
}