CH6-OLED
IIC-OLED
OLED_POWER原理图
CubeMX
下载线配置
OLED引脚配置
GPIO引脚配置
RTC配置

USART_DMA配置
USART参数配置
USART中断配置(IDLE)
NVIC配置
时钟树配置
生成文件配置1
生成文件配置2
MDK代码编写
oled
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| void IIC_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(); }
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);
}
|
function.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| #include "function.h" #include "gpio.h" #include "stdio.h" #include "string.h" #include "oled.h"
extern UART_HandleTypeDef huart2; extern DMA_HandleTypeDef hdma_usart2_tx; extern DMA_HandleTypeDef hdma_usart2_rx;
extern I2C_HandleTypeDef hi2c3; extern RTC_HandleTypeDef hrtc;
#define Usart_RX_buffer_len 100 unsigned char usart_rx_sec_len; unsigned char usart_rx_sec_flag; unsigned char usart_rx_buffer[Usart_RX_buffer_len];
void Usart_RX_Init(void) { __HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE); HAL_UART_Receive_DMA(&huart2,usart_rx_buffer,Usart_RX_buffer_len); }
void Usart_RX_EXTI(void) { if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE) == SET) { __HAL_UART_CLEAR_IDLEFLAG(&huart2); HAL_UART_DMAStop(&huart2); usart_rx_sec_len = Usart_RX_buffer_len - __HAL_DMA_GET_COUNTER(&hdma_usart2_rx); usart_rx_sec_flag=1; } } void Usart_RX_DEAL(void) { if(usart_rx_sec_flag==1) {
if((Usart_RX_mess[0]=='L') && (Usart_RX_mess[1]=='E') && (Usart_RX_mess[2]=='D')) { HAL_UART_Transmit_DMA(&huart2,Usart_RX_mess,Usart_RX_sec_len); }
usart_rx_sec_flag=0; usart_rx_sec_len=0; HAL_UART_Receive_DMA(&huart2,usart_rx_buffer,Usart_RX_buffer_len); } }
void IIC_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(); }
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); }
unsigned char * RTC_Data(void) { static unsigned char rtc_data[7]; RTC_TimeTypeDef rtc_time_data; RTC_DateTypeDef rtc_date_data; HAL_RTC_GetTime(&hrtc,&rtc_time_data,RTC_FORMAT_BIN); HAL_RTC_GetDate(&hrtc,&rtc_date_data,RTC_FORMAT_BIN); rtc_data[0]=rtc_date_data.Year; rtc_data[1]=rtc_date_data.Month; rtc_data[2]=rtc_date_data.WeekDay; rtc_data[3]=rtc_date_data.Date; rtc_data[4]=rtc_time_data.Hours; rtc_data[5]=rtc_time_data.Minutes; rtc_data[6]=rtc_time_data.Seconds; return rtc_data; }
int fputc(int ch,FILE *f) { HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,0xffff); return ch; }
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(USER_KEY_Pin==GPIO_Pin) { flag_send_rtc=1; } }
|
function.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #ifndef __FUNCTION_H__ #define __FUNCTION_H__
void Usart_RX_Init(void); void Usart_RX_EXTI(void); void Usart_RX_DEAL(void);
void IIC_OLED_Init(unsigned char ms); void OLED_Write(unsigned char addr,unsigned char data);
unsigned char * RTC_Data(void);
#endif
|
main.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include "function.h" #include "stdio.h" #include "oled.h" int main(void) { Usart_RX_Init(); IIC_OLED_Init(100); unsigned char IIC_oled_data_1[16]; unsigned char IIC_oled_data_2[16]; unsigned char *RTC_data; extern unsigned char flag_send_rtc; while(1) { RTC_data=RTC_Data(); sprintf((char *)IIC_oled_data_2,"%d:%d:%d",RTC_data[4],RTC_data[5],RTC_data[6]); sprintf((char *)IIC_oled_data_1,"LQB"); OLED_ShowString(0,IIC_oled_data_1); OLED_ShowString(2,IIC_oled_data_2); if(flag_send_rtc) { flag_send_rtc=0; printf("RTC:%d-%d-%d %d:%d:%d \r\n",2000+RTC_data[0],RTC_data[1],RTC_data[3],RTC_data[4],RTC_data[5],RTC_data[6]); } Usart_RX_DEAL(); } }
|
注
==1.第15届包含的IIC数据包中oled.h中需要添加上#incldue “main.h”
==
==2.需要将USART_RX_IDLE_EXTI()
放进stm32l0xx_it.c中的void USART2_IRQHandler(void)
中==
==3.中断一定是UART_FLAG_IDLE==
==4.编译需要选择USE MicroLIB
==
