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==
