本帖最后由 stb988 于 2024-10-31 18:53 编辑
#申请开发板# 距离发布第一篇评测帖子也有几天了,【STM32WB09KE测评】+开箱环境搭建及点亮LED,跳转到上一帖子https://bbs.21ic.com/icview-3409534-1-1.html,这几天一有空就来学习研究这个开发板,今天我就测试了OLED驱动和RTC时钟调用与显示。
先来上个图看看,下面就是我测试显示出来的时间。
oled屏用的iic通信,接在开发板的34号和36号引脚。
下面是接的3.3V 和GND
之前调试用硬件IIC通信,但是也不知道怎么回事?一直没有设调对,索性先改用软件模拟IIC,把SCL配置到PA0,把SDA配置到PB14,再把uart也开启,RTC也开启,下面是STM32CubeMX配置的界面
下面就是根据mcu引脚,把到开发板对应的针脚 ,翻出电路图
再根据引脚标识,是user1和user3,
再找底板上的引脚
最后接上OLED屏,把oled驱动移植过来,但是并不能显示出字符,最后发现是IO口切换过快,数据失真了,如是加了一个延时函数,为了防止被编译器优化掉,代码如下
void IIC_delay(void)
{
volatile u16 t = 100;
while(t--);
}
再把串口的printf改写一下,把这代码添加到uart.c文件中
int fputc(int ch, FILE *f) {
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
还有一个地方不要忘记,必须把下面这里勾上,
最后就是测试RTC了
HAL初始化时,已经帮我们都初始化了,只要调用就可以了
RTC 时间和日期数据保存在 RTC_TimeTypeDef 和 RTC_DateTypeDef 结构体中。在需要读取的函数或主程序中定义这些结构体:
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
使用 HAL_RTC_GetTime 和 HAL_RTC_GetDate 函数来读取时间和日期。
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); // 获取时间
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN); // 获取日期
读取的时间和日期数据保存在 sTime 和 sDate 结构体的成员中,
uint8_t hours = sTime.Hours;
uint8_t minutes = sTime.Minutes;
uint8_t seconds = sTime.Seconds;
uint8_t day = sDate.Date;
uint8_t month = sDate.Month;
uint8_t year = sDate.Year;
最后全部代码如下
int main(void)
{
/* USER CODE BEGIN 1 */
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
uint8_t hours = sTime.Hours;
uint8_t minutes = sTime.Minutes;
uint8_t seconds = sTime.Seconds;
uint8_t day = sDate.Date;
uint8_t month = sDate.Month;
uint8_t year = sDate.Year;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* Configure the peripherals common clocks */
PeriphCommonClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_RTC_Init();
/* USER CODE BEGIN 2 */
OLED_Init();
OLED_Clear();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
printf("starting");
OLED_ShowChinese(18,0,0,16,1);//
OLED_ShowChinese(38,0,1,16,1);//
OLED_ShowChinese(54,0,2,16,1);//
OLED_ShowChinese(72,0,3,16,1);//
OLED_ShowChinese(88,0,4,16,1);//
OLED_ShowString(8,16,(uint8_t *)"ZHONGJINGYUAN",16,1);
// 获取时间和日期
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
sprintf(disbuf,"Time: %02d:%02d:%02d\n", sTime.Hours, sTime.Minutes, sTime.Seconds);
OLED_ShowString(8,32,(uint8_t *)disbuf,16,1);
sprintf(disbuf,"Date:20%02d-%02d-%02d\n",sDate.Year,sDate.Month, sDate.Date);
OLED_ShowString(8,48,(uint8_t *)disbuf,16,1);
OLED_Refresh();
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
HAL_Delay(100);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
以上就是对IIC,RTC,还有UART的测试。
|
|