摘要
最近在指導學生參見 藍橋杯 嵌入式比賽,比賽完成后開發板就閑置了,于是準備拿過來做一個好玩的東東,
總體思路是這樣的,計算機端通過上位機獲取視頻資訊,并將視頻資訊轉換成顯示屏可現實的資料,然后通過串口將資料發送到M4開發板,開發板在串口中斷中處理資料,最后將資料顯示到螢屏上,

上位機軟體
上位機軟體采用的是開源軟體 OLED_ToolBox,軟體下載地址:
https://shyboy.oss-cn-shenzhen.aliyuncs.com/readonly/OLED_ToolBox.exe
這個軟體是開源的,如果有興趣的話可以研究下原始碼,原始碼地址:
https://github.com/AnChangNice/oled_display_gui
軟體配置如下:

波特率建議采用100000,解析度采用240*160,橫向掃描,位元組橫向排列,
右邊選擇 Screen模式,在B站搜索 Bad Apple,打開視頻,將捕獲視窗拖到視頻上,調節下視窗大小,剛好包含影像即可,
操作小提示:
- 點擊
Scan Port掃描到串口后,一定要在下拉框再次點選對應的串口號才行! - 捕獲視窗是一個紅色的框框,點擊框框上部可進行拖拽移動,移動到合適位置后,一定要再次點擊滑鼠才能將視窗固定,
單片機代碼
單片機軟體在 顯示屏代碼 【HAL_06_LCD】的基礎上添加了串口接收功能,波特率1000000,并開啟了接收中斷,操作步驟如下:
① 添加 stm32g4xx_hal_uart.c , stm32g4xx_hal_uart_ex.c
雙擊Drivers/STM32G4xx_HAL_Driver,打開添加檔案對話框,在向上一級 -> Drivers -> STM32G4xx_HAL_Driver -> Src中,找到stm32g4xx_hal_uart.c , stm32g4xx_hal_uart_ex.c 并添加,添加后如下圖所示:

② 修改 stm32g4xx_hal_conf.h 檔案
在如下位置找到該檔案,并打開:

取消注釋 #define HAL_UART_MODULE_ENABLED 這一行,取下注釋后如下圖所示:

③ main.c 添加#include "stm32g4xx_hal_uart.h"
在 main.c 適當位置添加#include "stm32g4xx_hal_uart.h",添加后如下圖所示:

④ 復制如下 TIM 初始化的代碼
注意:下列代碼包含了UART1的初始化接收中斷,同學們可參考自行使用!
UART_HandleTypeDef huart1;
uint8_t uart_rx_buf1[1024 * 6]; //串口接收資料緩沖區1
uint8_t uart_rx_buf2[1024 * 6]; //串口接收資料緩沖區2
// UART1 初始化
static void MX_UART1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); //配置USART1外設的時鐘
__HAL_RCC_USART1_CLK_ENABLE(); //打開USART1的時鐘
__HAL_RCC_GPIOA_CLK_ENABLE();
huart1.Instance = USART1;
huart1.Init.BaudRate = 1000000; //設定波特率
huart1.Init.WordLength = UART_WORDLENGTH_8B; //設定資料位
huart1.Init.StopBits = UART_STOPBITS_1; //設定停止位
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
HAL_MultiProcessor_Init(&huart1, 0, UART_WAKEUPMETHOD_IDLELINE);
HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8);
HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8);
HAL_UARTEx_DisableFifoMode(&huart1);
GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; //復用開漏輸出
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;//復用功能
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化串口引腳PA9 PA10
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); //設定串口中斷優先級
HAL_NVIC_EnableIRQ(USART1_IRQn); //打開串口中斷
HAL_UART_Receive_IT(&huart1, uart_rx_buf1, 4800); //設定串口中斷緩沖區及中斷閾值(當前為1)
}
//串口中斷
void USART1_IRQHandler(void) //串口中斷
{
HAL_UART_IRQHandler(&huart1);
}
int buf = 1; //記錄當前使用的是buf1 還是 buf2
int disp = 0; //告訴main該顯示什么內容,0不顯示,1顯示buf1,2顯示buf2
//串口中斷回呼函式
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(buf == 1) //若果當前是使用的是buf1
{
buf = 2; //下次使用buf2
disp = 1;//告訴main顯示buf1的內容到螢屏
HAL_UART_Receive_IT(&huart1, uart_rx_buf2, 4800); //切換為buf2
}
else
{
buf = 1; //下次使用buf1
disp = 2;//告訴main顯示buf2的內容到螢屏
HAL_UART_Receive_IT(&huart1, uart_rx_buf1, 4800); //切換為buf2
}
}
⑤ 主函式main()內容
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_UART1_Init();
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
while (1)
{
if(disp == 1)
{
disp = 0;
LCD_UartPic(uart_rx_buf1);
}
else if(disp == 2)
{
disp = 0;
LCD_UartPic(uart_rx_buf2);
}
}
}
⑥LCD_UartPic()函式內容如下,次函式應放在lcd.c中
void LCD_UartPic(uc8 *c)
{
u32 index = 1, i = 0;
u8 x = 40;
u16 y = 0;
for(; x < 200; x++)
{
LCD_SetCursor(x, 280);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
for(y = 0; y < 30; y++)
{
for(i = 0; i < 8; i ++)
{
if((c[index] & (1 << i)) == 0x00)
{
LCD_WriteRAM(BackColor);
}
else
{
LCD_WriteRAM(TextColor);
}
}
index ++;
}
}
}
運行效果
雖然是彩屏,但是當成黑白屏使用了

如果你喜歡此文章,歡迎點贊 關注 收藏 轉發.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/277121.html
標籤:其他
上一篇:51單片機~運放控制聲控電路,運算放大器(各模式精細詳解),NE555時基電路芯片分析
下一篇:【單片機】數碼管應用
