12.双路ADC(扩展板模块)
(1)将时钟树配置为32MHz
(2)CubeMx的配置
将PB0和PB1分别配置为ADC_IN8和ADC_IN9,然后点击ADC进入界面选择将Discontinuous Conversion Mode配置为enabled即可生成代码
(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;
extern ADC_HandleTypeDef hadc;
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)
{
static unsigned short int data[3];
for(char a=0;a<2;a++)
{
HAL_ADC_Start(&hadc);
HAL_ADC_PollForConversion(&hadc,0xFFFFFF);
data[a]=HAL_ADC_GetValue(&hadc);
}
HAL_ADC_Stop(&hadc);
data[2]=data[0];
data[0]=data[1];
data[1]=data[2];
return data;
}
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
/* USER CODE END Header */
/* 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;
unsigned short int *final_adc_value;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
final_adc_value = Final_Get_ADC();
HAL_Delay(100);
printf("ADC1=%.2fV ADC2=%.2fV\r\n",(float)final_adc_value[0]*3.3/4096,(float)final_adc_value[1]*3.3/4096);
sprintf((char *)final_oled_buffer,"ADC1=%.2fV",(float)final_adc_value[0]*3.3/4096);
OLED_ShowString(0,final_oled_buffer);
sprintf((char *)final_oled_buffer,"ADC2=%.2fV",(float)final_adc_value[1]*3.3/4096);
OLED_ShowString(2,final_oled_buffer);
Final_USART_RX_Deal();
/* USER CODE END WHILE */
(4)实验现象
13.矩阵键盘K6(扩展板模块)
(1)将时钟树配置为32MHz
(2)CubeMx的配置
将将PB0和PB1配置为GPIO_Output,标签分别为:COLUMN2和COLUMN1,将PB6和PB7配置为GPIO_Input,上拉,标签分别为:ROW1和ROW2,即可生成代码。
(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 char Final_K6(void)
{
unsigned char value=0;
HAL_GPIO_WritePin(COLUMN1_GPIO_Port,COLUMN1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(COLUMN2_GPIO_Port, COLUMN2_Pin, GPIO_PIN_SET);
if(HAL_GPIO_ReadPin(ROW1_GPIO_Port,ROW1_Pin)==RESET)
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(ROW1_GPIO_Port,ROW1_Pin)==RESET)
{
value=1;
while(HAL_GPIO_ReadPin(ROW1_GPIO_Port,ROW1_Pin)==RESET);
}
}
if(HAL_GPIO_ReadPin(ROW2_GPIO_Port,ROW2_Pin)==RESET)
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(ROW2_GPIO_Port,ROW2_Pin)==RESET)
{
value=4;
while(HAL_GPIO_ReadPin(ROW2_GPIO_Port,ROW2_Pin)==RESET);
}
}
HAL_GPIO_WritePin(COLUMN1_GPIO_Port,COLUMN1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(COLUMN2_GPIO_Port, COLUMN2_Pin, GPIO_PIN_RESET);
if(HAL_GPIO_ReadPin(ROW1_GPIO_Port,ROW1_Pin)==RESET)
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(ROW1_GPIO_Port,ROW1_Pin)==RESET)
{
value=2;
while(HAL_GPIO_ReadPin(ROW1_GPIO_Port,ROW1_Pin)==RESET);
}
}
if(HAL_GPIO_ReadPin(ROW1_GPIO_Port,ROW2_Pin)==RESET)
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(ROW2_GPIO_Port,ROW2_Pin)==RESET)
{
value=5;
while(HAL_GPIO_ReadPin(ROW2_GPIO_Port,ROW2_Pin)==RESET);
}
}
return value;
}
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
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.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_k6_value;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
final_k6_value=Final_K6();
if(final_k6_value)
{
printf("K6_value:%d \r\n",final_k6_value);
sprintf((char *)final_oled_buffer,"K6_value:%d",final_k6_value);
OLED_ShowString(0,final_oled_buffer);
}
/* USER CODE END WHILE */