14.单路ADC(扩展板模块)
(1)将时钟树配置为32MHz
(2)CubeMx的配置
将PB0和PB1分别配置成TIM3_CH3和ADC_IN9,再进行如下配置即可生成代码
(3)keil代码的生成
Final.c
#include "Final.h"
#include "gpio.h"
#include "string.h"
#include "stdio.h"
#include "oled.h"
#include "lora.h"
#define final_uart_rx_buffer_len 100
unsigned char final_uart_rx_len;
unsigned char final_uart_rx_end_flag;
unsigned char final_uart_rx_buffer[final_uart_rx_buffer_len];
extern unsigned int final_ne555_state; //NE555的状态
extern unsigned int final_ne555_timer[3]; //NE555的每个状态的时间
extern UART_HandleTypeDef huart2;
extern DMA_HandleTypeDef hdma_usart2_rx;
extern I2C_HandleTypeDef hi2c3;
extern SPI_HandleTypeDef hspi1;
extern TIM_HandleTypeDef htim7;
extern TIM_HandleTypeDef htim3;
void Final_LD5(unsigned char state)
{
switch(state)
{
case 0:
HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_SET);
break;
case 1:
HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET);
break;
case 2:
HAL_GPIO_TogglePin(LD5_GPIO_Port, LD5_Pin);
break;
}
}
void Final_Relay(unsigned char number,unsigned char state)
{
switch(number)
{
case 1:
switch(state)
{
case 0:
HAL_GPIO_WritePin(K1_GPIO_Port, K1_Pin, GPIO_PIN_RESET);
break;
case 1:
HAL_GPIO_WritePin(K1_GPIO_Port, K1_Pin, GPIO_PIN_SET);
break;
case 2:
HAL_GPIO_TogglePin(K1_GPIO_Port, K1_Pin);
break;
}
break;
case 2:
switch(state)
{
case 0:
HAL_GPIO_WritePin(K2_GPIO_Port, K2_Pin, GPIO_PIN_RESET);
break;
case 1:
HAL_GPIO_WritePin(K2_GPIO_Port, K2_Pin, GPIO_PIN_SET);
break;
case 2:
HAL_GPIO_TogglePin(K2_GPIO_Port, K2_Pin);
break;
}
break;
}
}
//unsigned char Final_Key(void)
//{
// unsigned char value=0;
// if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==RESET)
// {
// HAL_Delay(20);
// if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==RESET)
// {
// value=1;
// while(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==RESET);
// }
// }
// return value;
//}
void HAL_GPIO_EXTI_Callback(unsigned short int GPIO_Pin)
{
if(GPIO_Pin==KEY_Pin)
Final_LD5(2);
}
void Final_UART_DMA_Tx(const unsigned char *final_uart_tx_data)
{
HAL_UART_Transmit_DMA(&huart2,final_uart_tx_data,strlen(final_uart_tx_data));
}
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,1000);
return ch;
}
void Final_USART_IDLE_RX(void)
{
if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)==SET)
{
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
HAL_UART_DMAStop(&huart2);
final_uart_rx_len=final_uart_rx_buffer_len-__HAL_DMA_GET_COUNTER(&hdma_usart2_rx);
final_uart_rx_end_flag=1;
}
}
void Final_USART_RX_Deal(void)
{
if(final_uart_rx_end_flag)
{
HAL_UART_Transmit_DMA(&huart2,final_uart_rx_buffer,final_uart_rx_buffer_len);
final_uart_rx_len=0;
final_uart_rx_end_flag=0;
HAL_UART_Receive_DMA(&huart2,final_uart_rx_buffer,final_uart_rx_buffer_len);
}
}
unsigned char *Final_RTC(void)
{
static unsigned char rtc_value[7];
extern RTC_HandleTypeDef hrtc;
RTC_TimeTypeDef time_value;
RTC_DateTypeDef date_value;
HAL_RTC_GetTime(&hrtc,&time_value,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc,&date_value,RTC_FORMAT_BIN);
rtc_value[0]=date_value.Year;
rtc_value[1]=date_value.Month;
rtc_value[2]=date_value.WeekDay;
rtc_value[3]=date_value.Date;
rtc_value[4]=time_value.Hours;
rtc_value[5]=time_value.Minutes;
rtc_value[6]=time_value.Seconds;
return rtc_value;
}
void OLED_Write(unsigned char addr,unsigned char data)
{
unsigned char pdata[2];
pdata[0]=addr;
pdata[1]=data;
HAL_I2C_Master_Transmit(&hi2c3,0x78,pdata,2,0xff);
}
void Final_OLED_Init(unsigned char ms)
{
HAL_GPIO_WritePin(OLED_Power_GPIO_Port, OLED_Power_Pin, GPIO_PIN_RESET);
HAL_Delay(ms);
OLED_Init();
OLED_Clear();
}
unsigned char SPI_WriteRead(unsigned char addr,unsigned char data)
{
unsigned char Tx_Data[2];
unsigned char Rx_Data[2];
Tx_Data[0]=addr;
Tx_Data[1]=data;
HAL_GPIO_WritePin(SPI_NSS_GPIO_Port, SPI_NSS_Pin, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1,Tx_Data,Rx_Data,2,0xFF);
HAL_GPIO_WritePin(SPI_NSS_GPIO_Port, SPI_NSS_Pin, GPIO_PIN_SET);
return Rx_Data[1];
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static int count=0;
if(htim->Instance==TIM7)
{
if(++count>1000)
{
count=0;
//printf("1sec\r\n");
}
}
}
//名称:Final_Get_ADC
//作用:捕获ADC的原始值
//参数:无
//返回值:ADC的原始值
//备注:无
unsigned short int Final_Get_ADC(void)
{
extern ADC_HandleTypeDef hadc;
HAL_ADC_Start(&hadc); //启动ADC转换
return HAL_ADC_GetValue(&hadc); //获取AD值
}
//名称:HAL_TIM_IC_CaptureCallback
//作用:获取NE555的每个时间段的时间
//参数:无
//返回值:无
//备注:无
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM3)
{
if(final_ne555_state==0)
{
final_ne555_timer[0] = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_3); //高电平捕获,记录此时的值
__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_3,TIM_ICPOLARITY_FALLING); //设置成下降沿捕获
final_ne555_state++;
}
else if(final_ne555_state==1)
{
final_ne555_timer[1] = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_3); //低电平捕获,记录此时的值
__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_RISING); //设置上升沿捕获
final_ne555_state++;
}
else if(final_ne555_state==2)
{
final_ne555_timer[2] = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_3); //高电平捕获,记录此时的值
//HAL_TIM_IC_Stop_IT(&htim3, TIM_CHANNEL_3); //使能定时器3通道3的PWM输入捕获
final_ne555_state++;
}
}
}
void Final_Init()
{
Final_LD5(0);
Final_Relay(1,0);
Final_Relay(2,0);
Final_OLED_Init(100);
LORA_Init();
__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart2,final_uart_rx_buffer,final_uart_rx_buffer_len);
HAL_TIM_Base_Start_IT(&htim7);
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_3); //使能定时器3通道3的PWM输入捕获
}
main.c
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "dma.h"
#include "i2c.h"
#include "rtc.h"
#include "spi.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "Final.h"
#include "oled.h"
#include "lora.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
unsigned char final_ne555_state; //NE555的状态
unsigned int final_ne555_timer[3]; //NE555的每个状态的时间
unsigned int high_time=0; //高电平的时间
unsigned int low_time=0; //低电平的时间
unsigned int period_time=0; //周期
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
Final_Init();
static unsigned char final_oled_buffer[16];
static unsigned char *final_uart_tx_data;
static unsigned char final_lora_tx[5]={0xAA,0xbb};
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
Final_USART_RX_Deal();
if(final_ne555_state==3)
{
high_time = final_ne555_timer[1]- final_ne555_timer[0]; //计算高电平时间
low_time= final_ne555_timer[2]- final_ne555_timer[1]; //计算低电平时间
period_time= final_ne555_timer[2]- final_ne555_timer[0]; //计算周期
printf("period_time=%d\r\n",1000000/period_time); //计算周期
final_ne555_state = 0;
__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_3,TIM_INPUTCHANNELPOLARITY_RISING); //设置成上升沿捕获
}
printf("ADC:0x%4d",Final_Get_ADC());
HAL_Delay(500);
Final_LD5(2);
/* USER CODE END WHILE */
(4)实验现象
14.单路ADC(扩展板模块)
(1)将时钟树配置为32MHz
(2)CubeMx的配置
将PB1和PB6分别配置为:ADC_IN9和GPIO_Iuput并且将标签改为AS312,生成代码即可
(3)keil代码的生成
Final.c
#include "Final.h"
#include "gpio.h"
#include "string.h"
#include "stdio.h"
#include "oled.h"
#include "lora.h"
#define final_uart_rx_buffer_len 100
unsigned char final_uart_rx_len;
unsigned char final_uart_rx_end_flag;
unsigned char final_uart_rx_buffer[final_uart_rx_buffer_len];
extern UART_HandleTypeDef huart2;
extern DMA_HandleTypeDef hdma_usart2_rx;
extern I2C_HandleTypeDef hi2c3;
extern SPI_HandleTypeDef hspi1;
extern TIM_HandleTypeDef htim7;
void Final_LD5(unsigned char state)
{
switch(state)
{
case 0:
HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_SET);
break;
case 1:
HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET);
break;
case 2:
HAL_GPIO_TogglePin(LD5_GPIO_Port, LD5_Pin);
break;
}
}
void Final_Relay(unsigned char number,unsigned char state)
{
switch(number)
{
case 1:
switch(state)
{
case 0:
HAL_GPIO_WritePin(K1_GPIO_Port, K1_Pin, GPIO_PIN_RESET);
break;
case 1:
HAL_GPIO_WritePin(K1_GPIO_Port, K1_Pin, GPIO_PIN_SET);
break;
case 2:
HAL_GPIO_TogglePin(K1_GPIO_Port, K1_Pin);
break;
}
break;
case 2:
switch(state)
{
case 0:
HAL_GPIO_WritePin(K2_GPIO_Port, K2_Pin, GPIO_PIN_RESET);
break;
case 1:
HAL_GPIO_WritePin(K2_GPIO_Port, K2_Pin, GPIO_PIN_SET);
break;
case 2:
HAL_GPIO_TogglePin(K2_GPIO_Port, K2_Pin);
break;
}
break;
}
}
//unsigned char Final_Key(void)
//{
// unsigned char value=0;
// if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==RESET)
// {
// HAL_Delay(20);
// if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==RESET)
// {
// value=1;
// while(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==RESET);
// }
// }
// return value;
//}
void HAL_GPIO_EXTI_Callback(unsigned short int GPIO_Pin)
{
if(GPIO_Pin==KEY_Pin)
Final_LD5(2);
}
void Final_UART_DMA_Tx(const unsigned char *final_uart_tx_data)
{
HAL_UART_Transmit_DMA(&huart2,final_uart_tx_data,strlen(final_uart_tx_data));
}
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,1000);
return ch;
}
void Final_USART_IDLE_RX(void)
{
if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)==SET)
{
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
HAL_UART_DMAStop(&huart2);
final_uart_rx_len=final_uart_rx_buffer_len-__HAL_DMA_GET_COUNTER(&hdma_usart2_rx);
final_uart_rx_end_flag=1;
}
}
void Final_USART_RX_Deal(void)
{
if(final_uart_rx_end_flag)
{
HAL_UART_Transmit_DMA(&huart2,final_uart_rx_buffer,final_uart_rx_buffer_len);
final_uart_rx_len=0;
final_uart_rx_end_flag=0;
HAL_UART_Receive_DMA(&huart2,final_uart_rx_buffer,final_uart_rx_buffer_len);
}
}
unsigned char *Final_RTC(void)
{
static unsigned char rtc_value[7];
extern RTC_HandleTypeDef hrtc;
RTC_TimeTypeDef time_value;
RTC_DateTypeDef date_value;
HAL_RTC_GetTime(&hrtc,&time_value,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc,&date_value,RTC_FORMAT_BIN);
rtc_value[0]=date_value.Year;
rtc_value[1]=date_value.Month;
rtc_value[2]=date_value.WeekDay;
rtc_value[3]=date_value.Date;
rtc_value[4]=time_value.Hours;
rtc_value[5]=time_value.Minutes;
rtc_value[6]=time_value.Seconds;
return rtc_value;
}
void OLED_Write(unsigned char addr,unsigned char data)
{
unsigned char pdata[2];
pdata[0]=addr;
pdata[1]=data;
HAL_I2C_Master_Transmit(&hi2c3,0x78,pdata,2,0xff);
}
void Final_OLED_Init(unsigned char ms)
{
HAL_GPIO_WritePin(OLED_Power_GPIO_Port, OLED_Power_Pin, GPIO_PIN_RESET);
HAL_Delay(ms);
OLED_Init();
OLED_Clear();
}
unsigned char SPI_WriteRead(unsigned char addr,unsigned char data)
{
unsigned char Tx_Data[2];
unsigned char Rx_Data[2];
Tx_Data[0]=addr;
Tx_Data[1]=data;
HAL_GPIO_WritePin(SPI_NSS_GPIO_Port, SPI_NSS_Pin, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1,Tx_Data,Rx_Data,2,0xFF);
HAL_GPIO_WritePin(SPI_NSS_GPIO_Port, SPI_NSS_Pin, GPIO_PIN_SET);
return Rx_Data[1];
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static int count=0;
if(htim->Instance==TIM7)
{
if(++count>1000)
{
count=0;
//printf("1sec\r\n");
}
}
}
unsigned short int Final_Get_ADC(void)
{
extern ADC_HandleTypeDef hadc;
HAL_ADC_Start(&hadc);
return HAL_ADC_GetValue(&hadc);
}
unsigned char Final_AS312(void)
{
return (HAL_GPIO_ReadPin(AS312_GPIO_Port,AS312_Pin));
}
void Final_Init()
{
Final_LD5(0);
Final_Relay(1,0);
Final_Relay(2,0);
Final_OLED_Init(100);
LORA_Init();
__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart2,final_uart_rx_buffer,final_uart_rx_buffer_len);
HAL_TIM_Base_Start_IT(&htim7);
}
main.c
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "dma.h"
#include "i2c.h"
#include "rtc.h"
#include "spi.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "Final.h"
#include "oled.h"
#include "lora.h"
/* USER CODE END Includes */
/* USER CODE BEGIN 2 */
Final_Init();
static unsigned char final_oled_buffer[16];
static unsigned char *final_uart_tx_data;
static unsigned char final_lora_tx[5]={0xAA,0xbb};
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
printf("ADC=0x%x AS312:%d\r\n",Final_Get_ADC(),Final_AS312());
Final_LD5(Final_AS312());
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
(4)实验现象
当有人靠近时AS312为1,反之为0