{"id":60887,"date":"2026-01-16T15:25:34","date_gmt":"2026-01-16T07:25:34","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/60887.html"},"modified":"2026-01-16T15:25:34","modified_gmt":"2026-01-16T07:25:34","slug":"stm32%e6%99%ba%e8%83%bd%e6%b8%a9%e6%b9%bf%e5%ba%a6%e7%9b%91%e6%b5%8b%e7%b3%bb%e7%bb%9f%e5%ae%8c%e6%95%b4%e4%bb%a3%e7%a0%81","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/60887.html","title":{"rendered":"STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801"},"content":{"rendered":"<\/p>\n<h4>STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801<\/h4>\n<ul>\n<li>STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801<\/li>\n<li>\n<ul>\n<li>\u5de5\u7a0b\u7ed3\u6784<\/li>\n<li>1. \u914d\u7f6e\u6587\u4ef6 config.h<\/li>\n<li>2. DHT22 \u9a71\u52a8\u6587\u4ef6 dht22.h<\/li>\n<li>3. DHT22 \u9a71\u52a8\u6587\u4ef6 dht22.c<\/li>\n<li>4. OLED \u9a71\u52a8\u6587\u4ef6 oled.h<\/li>\n<li>5. OLED \u9a71\u52a8\u6587\u4ef6 oled.c<\/li>\n<li>6. \u8702\u9e23\u5668\u9a71\u52a8\u6587\u4ef6 beep.h<\/li>\n<li>7. \u8702\u9e23\u5668\u9a71\u52a8\u6587\u4ef6 beep.c<\/li>\n<li>8. \u4e3b\u51fd\u6570\u6587\u4ef6 main.c<\/li>\n<li>9. main.h \u5934\u6587\u4ef6<\/li>\n<li>10. \u4f7f\u7528\u8bf4\u660e<\/li>\n<li>\n<ul>\n<li>\u786c\u4ef6\u8fde\u63a5<\/li>\n<li>\u7f16\u8bd1\u548c\u4e0b\u8f7d<\/li>\n<li>\u529f\u80fd\u8bf4\u660e<\/li>\n<li>\u4e0a\u4f4d\u673a\u901a\u4fe1\u683c\u5f0f<\/li>\n<\/ul>\n<\/li>\n<li>\u6269\u5c55\u5efa\u8bae<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801<\/h2>\n<h3>\u5de5\u7a0b\u7ed3\u6784<\/h3>\n<p>project\/<br \/>\n\u251c\u2500\u2500 Core\/<br \/>\n\u2502   \u251c\u2500\u2500 Inc\/<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 dht22.h<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 oled.h<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 beep.h<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 config.h<br \/>\n\u2502   \u2514\u2500\u2500 Src\/<br \/>\n\u2502       \u251c\u2500\u2500 main.c<br \/>\n\u2502       \u251c\u2500\u2500 dht22.c<br \/>\n\u2502       \u251c\u2500\u2500 oled.c<br \/>\n\u2502       \u2514\u2500\u2500 beep.c<br \/>\n\u2514\u2500\u2500 Drivers\/<br \/>\n    \u2514\u2500\u2500 STM32F1xx_HAL_Driver\/<\/p>\n<h3>1. \u914d\u7f6e\u6587\u4ef6 config.h<\/h3>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifndef<\/span> <span class=\"token expression\">__CONFIG_H<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">__CONFIG_H<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifdef<\/span> <span class=\"token expression\">__cplusplus<\/span><\/span><br \/>\n<span class=\"token keyword\">extern<\/span> <span class=\"token string\">&#034;C&#034;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7cfb\u7edf\u914d\u7f6e\u53c2\u6570<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">DEBUG_MODE<\/span>                   <span class=\"token expression\"><span class=\"token number\">1<\/span>      <\/span><span class=\"token comment\">\/\/ \u8c03\u8bd5\u6a21\u5f0f\u5f00\u5173<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">SYS_CLOCK_FREQ<\/span>              <span class=\"token expression\"><span class=\"token number\">72000000<\/span> <\/span><span class=\"token comment\">\/\/ \u7cfb\u7edf\u65f6\u949f\u9891\u7387 72MHz<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ DHT22 \u914d\u7f6e<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">DHT22_PIN<\/span>                   <span class=\"token expression\">GPIO_PIN_0<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">DHT22_PORT<\/span>                  <span class=\"token expression\">GPIOA<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">DHT22_TIMEOUT<\/span>               <span class=\"token expression\"><span class=\"token number\">1000<\/span>    <\/span><span class=\"token comment\">\/\/ \u8d85\u65f6\u65f6\u95f4(ms)<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ OLED \u914d\u7f6e (I2C1)<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_I2C<\/span>                    <span class=\"token expression\">I2C1<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_ADDRESS<\/span>                <span class=\"token expression\"><span class=\"token number\">0x78<\/span>    <\/span><span class=\"token comment\">\/\/ OLED I2C\u5730\u5740<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_WIDTH<\/span>                  <span class=\"token expression\"><span class=\"token number\">128<\/span>     <\/span><span class=\"token comment\">\/\/ OLED\u5bbd\u5ea6<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_HEIGHT<\/span>                 <span class=\"token expression\"><span class=\"token number\">64<\/span>      <\/span><span class=\"token comment\">\/\/ OLED\u9ad8\u5ea6<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8702\u9e23\u5668\u914d\u7f6e<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">BEEP_PIN<\/span>                    <span class=\"token expression\">GPIO_PIN_1<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">BEEP_PORT<\/span>                   <span class=\"token expression\">GPIOA<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">BEEP_ON_TIME<\/span>                <span class=\"token expression\"><span class=\"token number\">500<\/span>     <\/span><span class=\"token comment\">\/\/ \u8702\u9e23\u6301\u7eed\u65f6\u95f4(ms)<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u4e32\u53e3\u914d\u7f6e<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">DEBUG_UART<\/span>                  <span class=\"token expression\">USART1<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">UART_BAUDRATE<\/span>               <span class=\"token expression\"><span class=\"token number\">115200<\/span>  <\/span><span class=\"token comment\">\/\/ \u6ce2\u7279\u7387<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u62a5\u8b66\u9608\u503c<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">TEMP_ALARM_THRESHOLD<\/span>        <span class=\"token expression\"><span class=\"token number\">30.0f<\/span>   <\/span><span class=\"token comment\">\/\/ \u6e29\u5ea6\u62a5\u8b66\u9608\u503c(\u2103)<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">HUMIDITY_ALARM_THRESHOLD<\/span>    <span class=\"token expression\"><span class=\"token number\">80.0f<\/span>   <\/span><span class=\"token comment\">\/\/ \u6e7f\u5ea6\u62a5\u8b66\u9608\u503c(%)<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u91c7\u6837\u95f4\u9694<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">SAMPLE_INTERVAL_MS<\/span>          <span class=\"token expression\"><span class=\"token number\">2000<\/span>    <\/span><span class=\"token comment\">\/\/ \u91c7\u6837\u95f4\u9694(ms)<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u9519\u8bef\u4ee3\u7801\u5b9a\u4e49<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">enum<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    ERROR_NONE <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    ERROR_DHT22_TIMEOUT<span class=\"token punctuation\">,<\/span><br \/>\n    ERROR_DHT22_CHECKSUM<span class=\"token punctuation\">,<\/span><br \/>\n    ERROR_OLED_INIT_FAILED<span class=\"token punctuation\">,<\/span><br \/>\n    ERROR_OLED_COMM_FAILED<span class=\"token punctuation\">,<\/span><br \/>\n    ERROR_I2C_BUSY<span class=\"token punctuation\">,<\/span><br \/>\n    ERROR_I2C_ERROR<br \/>\n<span class=\"token punctuation\">}<\/span> ErrorCode_t<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifdef<\/span> <span class=\"token expression\">__cplusplus<\/span><\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span> <span class=\"token comment\">\/* __CONFIG_H *\/<\/span><\/span><\/p>\n<h3>2. DHT22 \u9a71\u52a8\u6587\u4ef6 dht22.h<\/h3>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifndef<\/span> <span class=\"token expression\">__DHT22_H<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">__DHT22_H<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;stm32f1xx_hal.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;config.h&#034;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifdef<\/span> <span class=\"token expression\">__cplusplus<\/span><\/span><br \/>\n<span class=\"token keyword\">extern<\/span> <span class=\"token string\">&#034;C&#034;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ DHT22\u6570\u636e\u7ed3\u6784<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">float<\/span> temperature<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">float<\/span> humidity<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> is_valid<span class=\"token punctuation\">;<\/span><br \/>\n    ErrorCode_t last_error<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> last_read_time<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> DHT22_Data_t<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u51fd\u6570\u58f0\u660e<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">DHT22_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nErrorCode_t <span class=\"token function\">DHT22_ReadData<\/span><span class=\"token punctuation\">(<\/span>DHT22_Data_t <span class=\"token operator\">*<\/span>data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">float<\/span> <span class=\"token function\">DHT22_GetTemperature<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">float<\/span> <span class=\"token function\">DHT22_GetHumidity<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">DHT22_DelayMicroseconds<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint32_t<\/span> us<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifdef<\/span> <span class=\"token expression\">__cplusplus<\/span><\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span> <span class=\"token comment\">\/* __DHT22_H *\/<\/span><\/span><\/p>\n<h3>3. DHT22 \u9a71\u52a8\u6587\u4ef6 dht22.c<\/h3>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;dht22.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5168\u5c40\u53d8\u91cf<\/span><br \/>\n<span class=\"token keyword\">static<\/span> DHT22_Data_t dht22_data <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">static<\/span> TIM_HandleTypeDef htim_delay<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5fae\u79d2\u7ea7\u5ef6\u65f6\u521d\u59cb\u5316<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">DHT22_DelayInit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">__HAL_RCC_TIM2_CLK_ENABLE<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    htim_delay<span class=\"token punctuation\">.<\/span>Instance <span class=\"token operator\">&#061;<\/span> TIM2<span class=\"token punctuation\">;<\/span><br \/>\n    htim_delay<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>Prescaler <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">72<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span>      <span class=\"token comment\">\/\/ 72MHz\/72 &#061; 1MHz<\/span><br \/>\n    htim_delay<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>CounterMode <span class=\"token operator\">&#061;<\/span> TIM_COUNTERMODE_UP<span class=\"token punctuation\">;<\/span><br \/>\n    htim_delay<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>Period <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0xFFFFFFFF<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    htim_delay<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>ClockDivision <span class=\"token operator\">&#061;<\/span> TIM_CLOCKDIVISION_DIV1<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token function\">HAL_TIM_Base_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>htim_delay<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">HAL_TIM_Base_Start<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>htim_delay<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5fae\u79d2\u7ea7\u5ef6\u65f6\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">DHT22_DelayMicroseconds<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint32_t<\/span> us<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> start <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">__HAL_TIM_GET_COUNTER<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>htim_delay<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">__HAL_TIM_GET_COUNTER<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>htim_delay<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> start<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;<\/span> us<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ DHT22\u521d\u59cb\u5316<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">DHT22_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    GPIO_InitTypeDef GPIO_InitStruct <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u542f\u7528GPIO\u65f6\u949f<\/span><br \/>\n    <span class=\"token function\">__HAL_RCC_GPIOA_CLK_ENABLE<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u914d\u7f6ePA0\u4e3a\u8f93\u51fa\u6a21\u5f0f&#xff08;\u521d\u59cb\u72b6\u6001&#xff09;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Pin <span class=\"token operator\">&#061;<\/span> DHT22_PIN<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Mode <span class=\"token operator\">&#061;<\/span> GPIO_MODE_OUTPUT_PP<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Pull <span class=\"token operator\">&#061;<\/span> GPIO_NOPULL<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Speed <span class=\"token operator\">&#061;<\/span> GPIO_SPEED_FREQ_HIGH<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">HAL_GPIO_Init<\/span><span class=\"token punctuation\">(<\/span>DHT22_PORT<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>GPIO_InitStruct<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u5ef6\u65f6\u5b9a\u65f6\u5668<\/span><br \/>\n    <span class=\"token function\">DHT22_DelayInit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u521d\u59cb\u72b6\u6001\u4e3a\u9ad8\u7535\u5e73<\/span><br \/>\n    <span class=\"token function\">HAL_GPIO_WritePin<\/span><span class=\"token punctuation\">(<\/span>DHT22_PORT<span class=\"token punctuation\">,<\/span> DHT22_PIN<span class=\"token punctuation\">,<\/span> GPIO_PIN_SET<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    dht22_data<span class=\"token punctuation\">.<\/span>is_valid <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    dht22_data<span class=\"token punctuation\">.<\/span>last_error <span class=\"token operator\">&#061;<\/span> ERROR_NONE<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\">DEBUG_MODE<\/span><\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[DHT22] Initialized successfully\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8bfb\u53d6DHT22\u6570\u636e<\/span><br \/>\nErrorCode_t <span class=\"token function\">DHT22_ReadData<\/span><span class=\"token punctuation\">(<\/span>DHT22_Data_t <span class=\"token operator\">*<\/span>data<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> bits<span class=\"token punctuation\">[<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> checksum <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> timeout <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> i<span class=\"token punctuation\">,<\/span> j<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>data <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> ERROR_DHT22_TIMEOUT<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 1. \u4e3b\u673a\u53d1\u9001\u5f00\u59cb\u4fe1\u53f7<\/span><br \/>\n    <span class=\"token function\">HAL_GPIO_WritePin<\/span><span class=\"token punctuation\">(<\/span>DHT22_PORT<span class=\"token punctuation\">,<\/span> DHT22_PIN<span class=\"token punctuation\">,<\/span> GPIO_PIN_RESET<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">DHT22_DelayMicroseconds<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u62c9\u4f4e\u81f3\u5c111ms<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5207\u6362\u4e3a\u8f93\u5165\u6a21\u5f0f<\/span><br \/>\n    GPIO_InitTypeDef GPIO_InitStruct <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Pin <span class=\"token operator\">&#061;<\/span> DHT22_PIN<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Mode <span class=\"token operator\">&#061;<\/span> GPIO_MODE_INPUT<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Pull <span class=\"token operator\">&#061;<\/span> GPIO_PULLUP<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">HAL_GPIO_Init<\/span><span class=\"token punctuation\">(<\/span>DHT22_PORT<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>GPIO_InitStruct<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u7b49\u5f85DHT22\u54cd\u5e94<\/span><br \/>\n    <span class=\"token function\">DHT22_DelayMicroseconds<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">30<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u7b49\u5f85DHT22\u62c9\u4f4e80us<\/span><br \/>\n    timeout <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">HAL_GPIO_ReadPin<\/span><span class=\"token punctuation\">(<\/span>DHT22_PORT<span class=\"token punctuation\">,<\/span> DHT22_PIN<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIO_PIN_RESET<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        timeout<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">DHT22_DelayMicroseconds<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>timeout <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            dht22_data<span class=\"token punctuation\">.<\/span>last_error <span class=\"token operator\">&#061;<\/span> ERROR_DHT22_TIMEOUT<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\">DEBUG_MODE<\/span><\/span><br \/>\n            <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[DHT22] Timeout waiting for low response\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><br \/>\n            <span class=\"token keyword\">return<\/span> ERROR_DHT22_TIMEOUT<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u7b49\u5f85DHT22\u62c9\u9ad880us<\/span><br \/>\n    timeout <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">HAL_GPIO_ReadPin<\/span><span class=\"token punctuation\">(<\/span>DHT22_PORT<span class=\"token punctuation\">,<\/span> DHT22_PIN<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIO_PIN_SET<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        timeout<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">DHT22_DelayMicroseconds<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>timeout <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            dht22_data<span class=\"token punctuation\">.<\/span>last_error <span class=\"token operator\">&#061;<\/span> ERROR_DHT22_TIMEOUT<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> ERROR_DHT22_TIMEOUT<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 3. \u8bfb\u53d640\u4f4d\u6570\u636e<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>j <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> j <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">;<\/span> j<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u7b49\u5f85\u4f4e\u7535\u5e73\u7ed3\u675f&#xff08;50us&#xff09;<\/span><br \/>\n            timeout <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">HAL_GPIO_ReadPin<\/span><span class=\"token punctuation\">(<\/span>DHT22_PORT<span class=\"token punctuation\">,<\/span> DHT22_PIN<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIO_PIN_RESET<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                timeout<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token function\">DHT22_DelayMicroseconds<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>timeout <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    dht22_data<span class=\"token punctuation\">.<\/span>last_error <span class=\"token operator\">&#061;<\/span> ERROR_DHT22_TIMEOUT<span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">return<\/span> ERROR_DHT22_TIMEOUT<span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u6d4b\u91cf\u9ad8\u7535\u5e73\u65f6\u95f4<\/span><br \/>\n            <span class=\"token class-name\">uint32_t<\/span> high_time <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">HAL_GPIO_ReadPin<\/span><span class=\"token punctuation\">(<\/span>DHT22_PORT<span class=\"token punctuation\">,<\/span> DHT22_PIN<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIO_PIN_SET<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                high_time<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token function\">DHT22_DelayMicroseconds<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>high_time <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u6839\u636e\u9ad8\u7535\u5e73\u65f6\u95f4\u5224\u65ad\u662f0\u8fd8\u662f1<\/span><br \/>\n            bits<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&lt;&lt;&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>high_time <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">40<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>  <span class=\"token comment\">\/\/ \u9ad8\u7535\u5e73\u6301\u7eed\u65f6\u95f4\u5927\u4e8e40us\u8868\u793a\u6570\u636e1<\/span><br \/>\n                bits<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">|&#061;<\/span> <span class=\"token number\">0x01<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 4. \u6821\u9a8c\u6570\u636e<\/span><br \/>\n    checksum <span class=\"token operator\">&#061;<\/span> bits<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> bits<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> bits<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> bits<span class=\"token punctuation\">[<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>checksum <span class=\"token operator\">!&#061;<\/span> bits<span class=\"token punctuation\">[<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        dht22_data<span class=\"token punctuation\">.<\/span>last_error <span class=\"token operator\">&#061;<\/span> ERROR_DHT22_CHECKSUM<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\">DEBUG_MODE<\/span><\/span><br \/>\n        <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[DHT22] Checksum error: %d !&#061; %d\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> checksum<span class=\"token punctuation\">,<\/span> bits<span class=\"token punctuation\">[<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><br \/>\n        <span class=\"token keyword\">return<\/span> ERROR_DHT22_CHECKSUM<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 5. \u89e3\u6790\u6e29\u6e7f\u5ea6\u6570\u636e<\/span><br \/>\n    <span class=\"token class-name\">int16_t<\/span> temp_raw <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>bits<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&amp;<\/span> <span class=\"token number\">0x7F<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">|<\/span> bits<span class=\"token punctuation\">[<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">int16_t<\/span> hum_raw <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>bits<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">|<\/span> bits<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>bits<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&amp;<\/span> <span class=\"token number\">0x80<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        temp_raw <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span>temp_raw<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u8d1f\u6570\u6e29\u5ea6<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    dht22_data<span class=\"token punctuation\">.<\/span>temperature <span class=\"token operator\">&#061;<\/span> temp_raw <span class=\"token operator\">\/<\/span> <span class=\"token number\">10.0f<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    dht22_data<span class=\"token punctuation\">.<\/span>humidity <span class=\"token operator\">&#061;<\/span> hum_raw <span class=\"token operator\">\/<\/span> <span class=\"token number\">10.0f<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    dht22_data<span class=\"token punctuation\">.<\/span>is_valid <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    dht22_data<span class=\"token punctuation\">.<\/span>last_read_time <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">HAL_GetTick<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    dht22_data<span class=\"token punctuation\">.<\/span>last_error <span class=\"token operator\">&#061;<\/span> ERROR_NONE<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u590d\u5236\u6570\u636e\u5230\u8f93\u51fa\u53c2\u6570<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>data <span class=\"token operator\">!&#061;<\/span> <span class=\"token operator\">&amp;<\/span>dht22_data<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">memcpy<\/span><span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>dht22_data<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>DHT22_Data_t<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\">DEBUG_MODE<\/span><\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[DHT22] Read successful: Temp&#061;%.1f\u00b0C, Hum&#061;%.1f%%\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n           dht22_data<span class=\"token punctuation\">.<\/span>temperature<span class=\"token punctuation\">,<\/span> dht22_data<span class=\"token punctuation\">.<\/span>humidity<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> ERROR_NONE<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u83b7\u53d6\u6e29\u5ea6<\/span><br \/>\n<span class=\"token keyword\">float<\/span> <span class=\"token function\">DHT22_GetTemperature<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>dht22_data<span class=\"token punctuation\">.<\/span>is_valid<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">DHT22_ReadData<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> dht22_data<span class=\"token punctuation\">.<\/span>temperature<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u83b7\u53d6\u6e7f\u5ea6<\/span><br \/>\n<span class=\"token keyword\">float<\/span> <span class=\"token function\">DHT22_GetHumidity<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>dht22_data<span class=\"token punctuation\">.<\/span>is_valid<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">DHT22_ReadData<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> dht22_data<span class=\"token punctuation\">.<\/span>humidity<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h3>4. OLED \u9a71\u52a8\u6587\u4ef6 oled.h<\/h3>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifndef<\/span> <span class=\"token expression\">__OLED_H<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">__OLED_H<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;stm32f1xx_hal.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;config.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdint.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifdef<\/span> <span class=\"token expression\">__cplusplus<\/span><\/span><br \/>\n<span class=\"token keyword\">extern<\/span> <span class=\"token string\">&#034;C&#034;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ OLED\u547d\u4ee4\u5b9a\u4e49<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_SET_CONTRAST<\/span>       <span class=\"token expression\"><span class=\"token number\">0x81<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_DISPLAY_ALL_ON<\/span>     <span class=\"token expression\"><span class=\"token number\">0xA5<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_DISPLAY_NORMAL<\/span>     <span class=\"token expression\"><span class=\"token number\">0xA6<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_DISPLAY_INVERSE<\/span>    <span class=\"token expression\"><span class=\"token number\">0xA7<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_DISPLAY_OFF<\/span>        <span class=\"token expression\"><span class=\"token number\">0xAE<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_DISPLAY_ON<\/span>         <span class=\"token expression\"><span class=\"token number\">0xAF<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_SET_MEMORY_MODE<\/span>    <span class=\"token expression\"><span class=\"token number\">0x20<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_SET_COL_ADDR<\/span>       <span class=\"token expression\"><span class=\"token number\">0x21<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_SET_PAGE_ADDR<\/span>      <span class=\"token expression\"><span class=\"token number\">0x22<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_SET_START_LINE<\/span>     <span class=\"token expression\"><span class=\"token number\">0x40<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_SET_SEG_REMAP<\/span>      <span class=\"token expression\"><span class=\"token number\">0xA0<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_SET_MUX_RATIO<\/span>      <span class=\"token expression\"><span class=\"token number\">0xA8<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_SET_COM_SCAN_DIR<\/span>   <span class=\"token expression\"><span class=\"token number\">0xC0<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_SET_DISPLAY_OFFSET<\/span> <span class=\"token expression\"><span class=\"token number\">0xD3<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_SET_COM_PINS<\/span>       <span class=\"token expression\"><span class=\"token number\">0xDA<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_SET_DISPLAY_CLK<\/span>    <span class=\"token expression\"><span class=\"token number\">0xD5<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_SET_PRECHARGE<\/span>      <span class=\"token expression\"><span class=\"token number\">0xD9<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_SET_VCOMH_DESELECT<\/span> <span class=\"token expression\"><span class=\"token number\">0xDB<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">OLED_CMD_SET_CHARGE_PUMP<\/span>    <span class=\"token expression\"><span class=\"token number\">0x8D<\/span><\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ OLED\u7ed3\u6784\u4f53<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> width<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> height<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> is_initialized<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> buffer<span class=\"token punctuation\">[<\/span><span class=\"token number\">128<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ 128&#215;64 bits &#061; 128*8 bytes<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> OLED_t<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5b57\u4f53\u7ed3\u6784<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token class-name\">uint8_t<\/span> <span class=\"token operator\">*<\/span>data<span class=\"token punctuation\">;<\/span>      <span class=\"token comment\">\/\/ \u5b57\u4f53\u6570\u636e<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> width<span class=\"token punctuation\">;<\/span>           <span class=\"token comment\">\/\/ \u5b57\u7b26\u5bbd\u5ea6<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> height<span class=\"token punctuation\">;<\/span>          <span class=\"token comment\">\/\/ \u5b57\u7b26\u9ad8\u5ea6<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> first_char<span class=\"token punctuation\">;<\/span>      <span class=\"token comment\">\/\/ \u7b2c\u4e00\u4e2a\u5b57\u7b26<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> last_char<span class=\"token punctuation\">;<\/span>       <span class=\"token comment\">\/\/ \u6700\u540e\u4e00\u4e2a\u5b57\u7b26<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> FontDef_t<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u51fd\u6570\u58f0\u660e<\/span><br \/>\nErrorCode_t <span class=\"token function\">OLED_Init<\/span><span class=\"token punctuation\">(<\/span>I2C_HandleTypeDef <span class=\"token operator\">*<\/span>hi2c<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_Clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_Update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_DrawPixel<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> x<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> y<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> color<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_DrawChar<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> x<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> y<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span> ch<span class=\"token punctuation\">,<\/span> FontDef_t <span class=\"token operator\">*<\/span>font<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> color<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_DrawString<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> x<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> y<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>str<span class=\"token punctuation\">,<\/span> FontDef_t <span class=\"token operator\">*<\/span>font<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> color<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_DrawLine<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> x1<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> y1<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> x2<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> y2<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> color<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_DrawRectangle<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> x<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> y<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> w<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> h<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> color<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_DrawFilledRectangle<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> x<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> y<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> w<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> h<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> color<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_DrawTemperature<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">float<\/span> temp<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_DrawHumidity<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">float<\/span> hum<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5916\u90e8\u5b57\u4f53\u58f0\u660e<\/span><br \/>\n<span class=\"token keyword\">extern<\/span> FontDef_t Font_6x8<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">extern<\/span> FontDef_t Font_7x10<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">extern<\/span> FontDef_t Font_11x18<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">extern<\/span> FontDef_t Font_16x26<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifdef<\/span> <span class=\"token expression\">__cplusplus<\/span><\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span> <span class=\"token comment\">\/* __OLED_H *\/<\/span><\/span><\/p>\n<h3>5. OLED \u9a71\u52a8\u6587\u4ef6 oled.c<\/h3>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;oled.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5168\u5c40\u53d8\u91cf<\/span><br \/>\n<span class=\"token keyword\">static<\/span> I2C_HandleTypeDef <span class=\"token operator\">*<\/span>hi2c_oled <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">static<\/span> OLED_t oled <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ 6&#215;8\u5b57\u4f53<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token class-name\">uint8_t<\/span> Font6x8<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">6<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/  <\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x5F<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/ !<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x07<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x07<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/ &#034;<\/span><br \/>\n    <span class=\"token comment\">\/\/ &#8230; \u66f4\u591a\u5b57\u7b26\u5b9a\u4e49&#xff08;\u6b64\u5904\u7b80\u5316&#xff0c;\u5b9e\u9645\u9700\u8981\u5b8c\u6574\u5b57\u4f53&#xff09;<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token number\">0x7C<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x12<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x11<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x12<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x7C<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/ A<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token number\">0x7F<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x49<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x49<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x49<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x36<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/ B<\/span><br \/>\n    <span class=\"token comment\">\/\/ &#8230; \u7ee7\u7eed\u6240\u6709\u9700\u8981\u7684\u5b57\u7b26<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>FontDef_t Font_6x8 <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>data <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>Font6x8<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>width <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">6<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>height <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>first_char <span class=\"token operator\">&#061;<\/span> <span class=\"token char\">&#039; &#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>last_char <span class=\"token operator\">&#061;<\/span> <span class=\"token char\">&#039;~&#039;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u53d1\u9001\u547d\u4ee4\u5230OLED<\/span><br \/>\n<span class=\"token keyword\">static<\/span> ErrorCode_t <span class=\"token function\">OLED_WriteCommand<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> cmd<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>hi2c_oled <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> ERROR_OLED_INIT_FAILED<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token class-name\">uint8_t<\/span> data<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span> cmd<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ Co&#061;0, D\/C#&#061;0 \u8868\u793a\u547d\u4ee4<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">HAL_I2C_Master_Transmit<\/span><span class=\"token punctuation\">(<\/span>hi2c_oled<span class=\"token punctuation\">,<\/span> OLED_ADDRESS<span class=\"token punctuation\">,<\/span> data<span class=\"token punctuation\">,<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span> HAL_MAX_DELAY<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> HAL_OK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\">DEBUG_MODE<\/span><\/span><br \/>\n        <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[OLED] Failed to send command: 0x%02X\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> cmd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><br \/>\n        <span class=\"token keyword\">return<\/span> ERROR_I2C_ERROR<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> ERROR_NONE<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u53d1\u9001\u6570\u636e\u5230OLED<\/span><br \/>\n<span class=\"token keyword\">static<\/span> ErrorCode_t <span class=\"token function\">OLED_WriteData<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> <span class=\"token operator\">*<\/span>data<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint16_t<\/span> size<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>hi2c_oled <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token constant\">NULL<\/span> <span class=\"token operator\">||<\/span> data <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> ERROR_OLED_INIT_FAILED<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u51c6\u5907\u4f20\u8f93&#xff1a;Co&#061;0, D\/C#&#061;1 \u8868\u793a\u6570\u636e<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> buffer<span class=\"token punctuation\">[<\/span>size <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    buffer<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0x40<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u6570\u636e\u6a21\u5f0f<\/span><\/p>\n<p>    <span class=\"token function\">memcpy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>buffer<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> data<span class=\"token punctuation\">,<\/span> size<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">HAL_I2C_Master_Transmit<\/span><span class=\"token punctuation\">(<\/span>hi2c_oled<span class=\"token punctuation\">,<\/span> OLED_ADDRESS<span class=\"token punctuation\">,<\/span> buffer<span class=\"token punctuation\">,<\/span> size <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> HAL_MAX_DELAY<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> HAL_OK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\">DEBUG_MODE<\/span><\/span><br \/>\n        <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[OLED] Failed to send data\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><br \/>\n        <span class=\"token keyword\">return<\/span> ERROR_I2C_ERROR<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> ERROR_NONE<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ OLED\u521d\u59cb\u5316<\/span><br \/>\nErrorCode_t <span class=\"token function\">OLED_Init<\/span><span class=\"token punctuation\">(<\/span>I2C_HandleTypeDef <span class=\"token operator\">*<\/span>hi2c<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>hi2c <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> ERROR_OLED_INIT_FAILED<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    hi2c_oled <span class=\"token operator\">&#061;<\/span> hi2c<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u547d\u4ee4\u5e8f\u5217<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> init_cmds<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        OLED_CMD_DISPLAY_OFF<span class=\"token punctuation\">,<\/span>        <span class=\"token comment\">\/\/ \u5173\u95ed\u663e\u793a<\/span><\/p>\n<p>        OLED_CMD_SET_DISPLAY_CLK<span class=\"token punctuation\">,<\/span>    <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u65f6\u949f\u5206\u9891<\/span><br \/>\n        <span class=\"token number\">0x80<\/span><span class=\"token punctuation\">,<\/span>                        <span class=\"token comment\">\/\/ \u65f6\u949f&#061;0xF&#xff0c;\u5206\u9891&#061;0x0<\/span><\/p>\n<p>        OLED_CMD_SET_MUX_RATIO<span class=\"token punctuation\">,<\/span>      <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u590d\u7528\u7387<\/span><br \/>\n        <span class=\"token number\">0x3F<\/span><span class=\"token punctuation\">,<\/span>                        <span class=\"token comment\">\/\/ 64MUX for 128&#215;64<\/span><\/p>\n<p>        OLED_CMD_SET_DISPLAY_OFFSET<span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u663e\u793a\u504f\u79fb<\/span><br \/>\n        <span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span>                        <span class=\"token comment\">\/\/ \u65e0\u504f\u79fb<\/span><\/p>\n<p>        OLED_CMD_SET_START_LINE <span class=\"token operator\">|<\/span> <span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u8d77\u59cb\u884c<\/span><\/p>\n<p>        OLED_CMD_SET_CHARGE_PUMP<span class=\"token punctuation\">,<\/span>    <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u7535\u8377\u6cf5<\/span><br \/>\n        <span class=\"token number\">0x14<\/span><span class=\"token punctuation\">,<\/span>                        <span class=\"token comment\">\/\/ \u542f\u7528\u7535\u8377\u6cf5<\/span><\/p>\n<p>        OLED_CMD_SET_MEMORY_MODE<span class=\"token punctuation\">,<\/span>    <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u5185\u5b58\u6a21\u5f0f<\/span><br \/>\n        <span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span>                        <span class=\"token comment\">\/\/ \u6c34\u5e73\u5bfb\u5740\u6a21\u5f0f<\/span><\/p>\n<p>        OLED_CMD_SET_SEG_REMAP <span class=\"token operator\">|<\/span> <span class=\"token number\">0x01<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/ \u5217\u5730\u5740127\u6620\u5c04\u5230SEG0<\/span><\/p>\n<p>        OLED_CMD_SET_COM_SCAN_DIR <span class=\"token operator\">|<\/span> <span class=\"token number\">0x08<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/ \u4eceCOM[N-1]\u626b\u63cf\u5230COM0<\/span><\/p>\n<p>        OLED_CMD_SET_COM_PINS<span class=\"token punctuation\">,<\/span>       <span class=\"token comment\">\/\/ \u8bbe\u7f6eCOM\u5f15\u811a\u786c\u4ef6\u914d\u7f6e<\/span><br \/>\n        <span class=\"token number\">0x12<\/span><span class=\"token punctuation\">,<\/span>                        <span class=\"token comment\">\/\/ 64\u884c\u6a21\u5f0f<\/span><\/p>\n<p>        OLED_CMD_SET_CONTRAST<span class=\"token punctuation\">,<\/span>       <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u5bf9\u6bd4\u5ea6<\/span><br \/>\n        <span class=\"token number\">0x7F<\/span><span class=\"token punctuation\">,<\/span>                        <span class=\"token comment\">\/\/ \u4e2d\u7b49\u5bf9\u6bd4\u5ea6<\/span><\/p>\n<p>        OLED_CMD_SET_PRECHARGE<span class=\"token punctuation\">,<\/span>      <span class=\"token comment\">\/\/ \u9884\u5145\u7535\u5468\u671f<\/span><br \/>\n        <span class=\"token number\">0xF1<\/span><span class=\"token punctuation\">,<\/span><\/p>\n<p>        OLED_CMD_SET_VCOMH_DESELECT<span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/ VCOMH\u53d6\u6d88\u9009\u62e9\u7535\u5e73<\/span><br \/>\n        <span class=\"token number\">0x40<\/span><span class=\"token punctuation\">,<\/span>                        <span class=\"token comment\">\/\/ ~0.77 * VCC<\/span><\/p>\n<p>        OLED_CMD_DISPLAY_ALL_ON <span class=\"token operator\">|<\/span> <span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/ \u4e0d\u4f7f\u7528\u5168\u4eae\u6a21\u5f0f<\/span><\/p>\n<p>        OLED_CMD_DISPLAY_NORMAL<span class=\"token punctuation\">,<\/span>     <span class=\"token comment\">\/\/ \u6b63\u5e38\u663e\u793a&#xff08;\u975e\u53cd\u767d&#xff09;<\/span><\/p>\n<p>        OLED_CMD_DISPLAY_ON          <span class=\"token comment\">\/\/ \u5f00\u542f\u663e\u793a<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u53d1\u9001\u521d\u59cb\u5316\u547d\u4ee4<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint16_t<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>init_cmds<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">OLED_WriteCommand<\/span><span class=\"token punctuation\">(<\/span>init_cmds<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> ERROR_NONE<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> ERROR_OLED_COMM_FAILED<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token function\">HAL_Delay<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6e05\u5c4f<\/span><br \/>\n    <span class=\"token function\">OLED_Clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">OLED_Update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    oled<span class=\"token punctuation\">.<\/span>width <span class=\"token operator\">&#061;<\/span> OLED_WIDTH<span class=\"token punctuation\">;<\/span><br \/>\n    oled<span class=\"token punctuation\">.<\/span>height <span class=\"token operator\">&#061;<\/span> OLED_HEIGHT<span class=\"token punctuation\">;<\/span><br \/>\n    oled<span class=\"token punctuation\">.<\/span>is_initialized <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\">DEBUG_MODE<\/span><\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[OLED] Initialized successfully\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> ERROR_NONE<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6e05\u5c4f<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_Clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span>oled<span class=\"token punctuation\">.<\/span>buffer<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>oled<span class=\"token punctuation\">.<\/span>buffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u66f4\u65b0\u663e\u793a<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_Update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>oled<span class=\"token punctuation\">.<\/span>is_initialized<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> page <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> page <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">;<\/span> page<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u9875\u5730\u5740<\/span><br \/>\n        <span class=\"token function\">OLED_WriteCommand<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0xB0<\/span> <span class=\"token operator\">&#043;<\/span> page<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u9875\u8d77\u59cb\u5730\u5740<\/span><br \/>\n        <span class=\"token function\">OLED_WriteCommand<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0x00<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>         <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u5217\u4f4e\u5730\u5740<\/span><br \/>\n        <span class=\"token function\">OLED_WriteCommand<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0x10<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>         <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u5217\u9ad8\u5730\u5740<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u53d1\u9001\u8be5\u9875\u7684\u6570\u636e<\/span><br \/>\n        <span class=\"token function\">OLED_WriteData<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>oled<span class=\"token punctuation\">.<\/span>buffer<span class=\"token punctuation\">[<\/span>page <span class=\"token operator\">*<\/span> <span class=\"token number\">128<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">128<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7ed8\u5236\u50cf\u7d20\u70b9<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_DrawPixel<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> x<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> y<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> color<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">&gt;&#061;<\/span> OLED_WIDTH <span class=\"token operator\">||<\/span> y <span class=\"token operator\">&gt;&#061;<\/span> OLED_HEIGHT<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token class-name\">uint16_t<\/span> byte_index <span class=\"token operator\">&#061;<\/span> x <span class=\"token operator\">&#043;<\/span> <span class=\"token punctuation\">(<\/span>y <span class=\"token operator\">\/<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">128<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> bit_mask <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token punctuation\">(<\/span>y <span class=\"token operator\">%<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>color<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        oled<span class=\"token punctuation\">.<\/span>buffer<span class=\"token punctuation\">[<\/span>byte_index<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">|&#061;<\/span> bit_mask<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        oled<span class=\"token punctuation\">.<\/span>buffer<span class=\"token punctuation\">[<\/span>byte_index<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&amp;&#061;<\/span> <span class=\"token operator\">~<\/span>bit_mask<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7ed8\u5236\u5b57\u7b26<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_DrawChar<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> x<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> y<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span> ch<span class=\"token punctuation\">,<\/span> FontDef_t <span class=\"token operator\">*<\/span>font<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> color<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>font <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token constant\">NULL<\/span> <span class=\"token operator\">||<\/span> ch <span class=\"token operator\">&lt;<\/span> font<span class=\"token operator\">-&gt;<\/span>first_char <span class=\"token operator\">||<\/span> ch <span class=\"token operator\">&gt;<\/span> font<span class=\"token operator\">-&gt;<\/span>last_char<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token class-name\">uint16_t<\/span> char_index <span class=\"token operator\">&#061;<\/span> ch <span class=\"token operator\">&#8211;<\/span> font<span class=\"token operator\">-&gt;<\/span>first_char<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token class-name\">uint8_t<\/span> <span class=\"token operator\">*<\/span>char_data <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&amp;<\/span>font<span class=\"token operator\">-&gt;<\/span>data<span class=\"token punctuation\">[<\/span>char_index <span class=\"token operator\">*<\/span> font<span class=\"token operator\">-&gt;<\/span>width<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> font<span class=\"token operator\">-&gt;<\/span>width<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token class-name\">uint8_t<\/span> line <span class=\"token operator\">&#061;<\/span> char_data<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> j <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> j <span class=\"token operator\">&lt;<\/span> font<span class=\"token operator\">-&gt;<\/span>height<span class=\"token punctuation\">;<\/span> j<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>line <span class=\"token operator\">&amp;<\/span> <span class=\"token number\">0x01<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token function\">OLED_DrawPixel<\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">&#043;<\/span> i<span class=\"token punctuation\">,<\/span> y <span class=\"token operator\">&#043;<\/span> j<span class=\"token punctuation\">,<\/span> color<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            line <span class=\"token operator\">&gt;&gt;&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7ed8\u5236\u5b57\u7b26\u4e32<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_DrawString<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> x<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> y<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>str<span class=\"token punctuation\">,<\/span> FontDef_t <span class=\"token operator\">*<\/span>font<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> color<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>str <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token constant\">NULL<\/span> <span class=\"token operator\">||<\/span> font <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token class-name\">uint8_t<\/span> current_x <span class=\"token operator\">&#061;<\/span> x<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>str<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">OLED_DrawChar<\/span><span class=\"token punctuation\">(<\/span>current_x<span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">*<\/span>str<span class=\"token punctuation\">,<\/span> font<span class=\"token punctuation\">,<\/span> color<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        current_x <span class=\"token operator\">&#043;&#061;<\/span> font<span class=\"token operator\">-&gt;<\/span>width <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u5b57\u7b26\u5bbd\u5ea6&#043;1\u50cf\u7d20\u95f4\u9694<\/span><br \/>\n        str<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7ed8\u5236\u6e29\u5ea6<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_DrawTemperature<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">float<\/span> temp<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> buffer<span class=\"token punctuation\">[<\/span><span class=\"token number\">32<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token function\">OLED_DrawString<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Temperature:&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>Font_6x8<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token function\">snprintf<\/span><span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;%.1f C&#034;<\/span><span class=\"token punctuation\">,<\/span> temp<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">OLED_DrawString<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">25<\/span><span class=\"token punctuation\">,<\/span> buffer<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>Font_6x8<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u7ed8\u5236\u6e29\u5ea6\u8ba1\u56fe\u6807<\/span><br \/>\n    <span class=\"token function\">OLED_DrawFilledRectangle<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">90<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">30<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u6e29\u5ea6\u8ba1\u4e3b\u4f53<\/span><br \/>\n    <span class=\"token function\">OLED_DrawRectangle<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">90<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">30<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>        <span class=\"token comment\">\/\/ \u8fb9\u6846<\/span><br \/>\n    <span class=\"token function\">OLED_DrawFilledCircle<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">92<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">45<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">6<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>         <span class=\"token comment\">\/\/ \u5e95\u90e8\u5706\u7403<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7ed8\u5236\u6e7f\u5ea6<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_DrawHumidity<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">float<\/span> hum<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> buffer<span class=\"token punctuation\">[<\/span><span class=\"token number\">32<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token function\">OLED_DrawString<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">45<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Humidity:&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>Font_6x8<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token function\">snprintf<\/span><span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;%.1f %%&#034;<\/span><span class=\"token punctuation\">,<\/span> hum<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">OLED_DrawString<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">55<\/span><span class=\"token punctuation\">,<\/span> buffer<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>Font_6x8<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u7ed8\u5236\u6c34\u6ef4\u56fe\u6807<\/span><br \/>\n    <span class=\"token function\">OLED_DrawFilledCircle<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">92<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">55<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">6<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7ed8\u5236\u586b\u5145\u77e9\u5f62&#xff08;\u8f85\u52a9\u51fd\u6570&#xff09;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_DrawFilledRectangle<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> x<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> y<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> w<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> h<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> color<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> h<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> j <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> j <span class=\"token operator\">&lt;<\/span> w<span class=\"token punctuation\">;<\/span> j<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">OLED_DrawPixel<\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">&#043;<\/span> j<span class=\"token punctuation\">,<\/span> y <span class=\"token operator\">&#043;<\/span> i<span class=\"token punctuation\">,<\/span> color<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7ed8\u5236\u586b\u5145\u5706&#xff08;\u8f85\u52a9\u51fd\u6570&#xff09;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">OLED_DrawFilledCircle<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> x0<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> y0<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> r<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint8_t<\/span> color<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token class-name\">int16_t<\/span> f <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span> <span class=\"token operator\">&#8211;<\/span> r<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">int16_t<\/span> ddF_x <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">int16_t<\/span> ddF_y <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">2<\/span> <span class=\"token operator\">*<\/span> r<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">int16_t<\/span> x <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">int16_t<\/span> y <span class=\"token operator\">&#061;<\/span> r<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u7ed8\u5236\u6c34\u5e73\u7ebf<\/span><br \/>\n    <span class=\"token function\">OLED_DrawLine<\/span><span class=\"token punctuation\">(<\/span>x0 <span class=\"token operator\">&#8211;<\/span> r<span class=\"token punctuation\">,<\/span> y0<span class=\"token punctuation\">,<\/span> x0 <span class=\"token operator\">&#043;<\/span> r<span class=\"token punctuation\">,<\/span> y0<span class=\"token punctuation\">,<\/span> color<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">&lt;<\/span> y<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>f <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            y<span class=\"token operator\">&#8212;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            ddF_y <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            f <span class=\"token operator\">&#043;&#061;<\/span> ddF_y<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        x<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        ddF_x <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        f <span class=\"token operator\">&#043;&#061;<\/span> ddF_x<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u7ed8\u5236\u6c34\u5e73\u7ebf<\/span><br \/>\n        <span class=\"token function\">OLED_DrawLine<\/span><span class=\"token punctuation\">(<\/span>x0 <span class=\"token operator\">&#8211;<\/span> x<span class=\"token punctuation\">,<\/span> y0 <span class=\"token operator\">&#043;<\/span> y<span class=\"token punctuation\">,<\/span> x0 <span class=\"token operator\">&#043;<\/span> x<span class=\"token punctuation\">,<\/span> y0 <span class=\"token operator\">&#043;<\/span> y<span class=\"token punctuation\">,<\/span> color<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">OLED_DrawLine<\/span><span class=\"token punctuation\">(<\/span>x0 <span class=\"token operator\">&#8211;<\/span> x<span class=\"token punctuation\">,<\/span> y0 <span class=\"token operator\">&#8211;<\/span> y<span class=\"token punctuation\">,<\/span> x0 <span class=\"token operator\">&#043;<\/span> x<span class=\"token punctuation\">,<\/span> y0 <span class=\"token operator\">&#8211;<\/span> y<span class=\"token punctuation\">,<\/span> color<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">OLED_DrawLine<\/span><span class=\"token punctuation\">(<\/span>x0 <span class=\"token operator\">&#8211;<\/span> y<span class=\"token punctuation\">,<\/span> y0 <span class=\"token operator\">&#043;<\/span> x<span class=\"token punctuation\">,<\/span> x0 <span class=\"token operator\">&#043;<\/span> y<span class=\"token punctuation\">,<\/span> y0 <span class=\"token operator\">&#043;<\/span> x<span class=\"token punctuation\">,<\/span> color<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">OLED_DrawLine<\/span><span class=\"token punctuation\">(<\/span>x0 <span class=\"token operator\">&#8211;<\/span> y<span class=\"token punctuation\">,<\/span> y0 <span class=\"token operator\">&#8211;<\/span> x<span class=\"token punctuation\">,<\/span> x0 <span class=\"token operator\">&#043;<\/span> y<span class=\"token punctuation\">,<\/span> y0 <span class=\"token operator\">&#8211;<\/span> x<span class=\"token punctuation\">,<\/span> color<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h3>6. \u8702\u9e23\u5668\u9a71\u52a8\u6587\u4ef6 beep.h<\/h3>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifndef<\/span> <span class=\"token expression\">__BEEP_H<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">__BEEP_H<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;stm32f1xx_hal.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;config.h&#034;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifdef<\/span> <span class=\"token expression\">__cplusplus<\/span><\/span><br \/>\n<span class=\"token keyword\">extern<\/span> <span class=\"token string\">&#034;C&#034;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p><span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">enum<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    BEEP_OFF <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    BEEP_ON<span class=\"token punctuation\">,<\/span><br \/>\n    BEEP_BLINK<br \/>\n<span class=\"token punctuation\">}<\/span> BeepState_t<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    BeepState_t state<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> on_time<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> off_time<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> last_change_time<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> is_active<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> Beep_t<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u51fd\u6570\u58f0\u660e<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">BEEP_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">BEEP_On<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">BEEP_Off<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">BEEP_Blink<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint32_t<\/span> on_time<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint32_t<\/span> off_time<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">BEEP_Update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">BEEP_SetAlarm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> enable<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token class-name\">uint8_t<\/span> <span class=\"token function\">BEEP_IsAlarmEnabled<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifdef<\/span> <span class=\"token expression\">__cplusplus<\/span><\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span> <span class=\"token comment\">\/* __BEEP_H *\/<\/span><\/span><\/p>\n<h3>7. \u8702\u9e23\u5668\u9a71\u52a8\u6587\u4ef6 beep.c<\/h3>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;beep.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;main.h&#034;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5168\u5c40\u53d8\u91cf<\/span><br \/>\n<span class=\"token keyword\">static<\/span> Beep_t beep <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8702\u9e23\u5668\u521d\u59cb\u5316<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">BEEP_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    GPIO_InitTypeDef GPIO_InitStruct <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u542f\u7528GPIO\u65f6\u949f<\/span><br \/>\n    <span class=\"token function\">__HAL_RCC_GPIOA_CLK_ENABLE<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u914d\u7f6e\u8702\u9e23\u5668\u5f15\u811a\u4e3a\u8f93\u51fa<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Pin <span class=\"token operator\">&#061;<\/span> BEEP_PIN<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Mode <span class=\"token operator\">&#061;<\/span> GPIO_MODE_OUTPUT_PP<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Pull <span class=\"token operator\">&#061;<\/span> GPIO_NOPULL<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Speed <span class=\"token operator\">&#061;<\/span> GPIO_SPEED_FREQ_LOW<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">HAL_GPIO_Init<\/span><span class=\"token punctuation\">(<\/span>BEEP_PORT<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>GPIO_InitStruct<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u521d\u59cb\u72b6\u6001\u4e3a\u5173\u95ed<\/span><br \/>\n    <span class=\"token function\">BEEP_Off<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    beep<span class=\"token punctuation\">.<\/span>state <span class=\"token operator\">&#061;<\/span> BEEP_OFF<span class=\"token punctuation\">;<\/span><br \/>\n    beep<span class=\"token punctuation\">.<\/span>is_active <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\">DEBUG_MODE<\/span><\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[BEEP] Initialized successfully\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6253\u5f00\u8702\u9e23\u5668<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">BEEP_On<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">HAL_GPIO_WritePin<\/span><span class=\"token punctuation\">(<\/span>BEEP_PORT<span class=\"token punctuation\">,<\/span> BEEP_PIN<span class=\"token punctuation\">,<\/span> GPIO_PIN_SET<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    beep<span class=\"token punctuation\">.<\/span>state <span class=\"token operator\">&#061;<\/span> BEEP_ON<span class=\"token punctuation\">;<\/span><br \/>\n    beep<span class=\"token punctuation\">.<\/span>is_active <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    beep<span class=\"token punctuation\">.<\/span>last_change_time <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">HAL_GetTick<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5173\u95ed\u8702\u9e23\u5668<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">BEEP_Off<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">HAL_GPIO_WritePin<\/span><span class=\"token punctuation\">(<\/span>BEEP_PORT<span class=\"token punctuation\">,<\/span> BEEP_PIN<span class=\"token punctuation\">,<\/span> GPIO_PIN_RESET<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    beep<span class=\"token punctuation\">.<\/span>state <span class=\"token operator\">&#061;<\/span> BEEP_OFF<span class=\"token punctuation\">;<\/span><br \/>\n    beep<span class=\"token punctuation\">.<\/span>is_active <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    beep<span class=\"token punctuation\">.<\/span>last_change_time <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">HAL_GetTick<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8bbe\u7f6e\u8702\u9e23\u5668\u95ea\u70c1<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">BEEP_Blink<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint32_t<\/span> on_time<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint32_t<\/span> off_time<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    beep<span class=\"token punctuation\">.<\/span>state <span class=\"token operator\">&#061;<\/span> BEEP_BLINK<span class=\"token punctuation\">;<\/span><br \/>\n    beep<span class=\"token punctuation\">.<\/span>on_time <span class=\"token operator\">&#061;<\/span> on_time<span class=\"token punctuation\">;<\/span><br \/>\n    beep<span class=\"token punctuation\">.<\/span>off_time <span class=\"token operator\">&#061;<\/span> off_time<span class=\"token punctuation\">;<\/span><br \/>\n    beep<span class=\"token punctuation\">.<\/span>last_change_time <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">HAL_GetTick<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    beep<span class=\"token punctuation\">.<\/span>is_active <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u521d\u59cb\u72b6\u6001\u4e3a\u6253\u5f00<\/span><br \/>\n    <span class=\"token function\">BEEP_On<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u66f4\u65b0\u8702\u9e23\u5668\u72b6\u6001&#xff08;\u9700\u8981\u5728\u4e3b\u5faa\u73af\u4e2d\u8c03\u7528&#xff09;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">BEEP_Update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>beep<span class=\"token punctuation\">.<\/span>is_active<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token class-name\">uint32_t<\/span> current_time <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">HAL_GetTick<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> elapsed <span class=\"token operator\">&#061;<\/span> current_time <span class=\"token operator\">&#8211;<\/span> beep<span class=\"token punctuation\">.<\/span>last_change_time<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">switch<\/span> <span class=\"token punctuation\">(<\/span>beep<span class=\"token punctuation\">.<\/span>state<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> BEEP_ON<span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>elapsed <span class=\"token operator\">&gt;&#061;<\/span> beep<span class=\"token punctuation\">.<\/span>on_time<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token function\">BEEP_Off<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">case<\/span> BEEP_OFF<span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>elapsed <span class=\"token operator\">&gt;&#061;<\/span> beep<span class=\"token punctuation\">.<\/span>off_time<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token function\">BEEP_On<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">case<\/span> BEEP_BLINK<span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>elapsed <span class=\"token operator\">&gt;&#061;<\/span> beep<span class=\"token punctuation\">.<\/span>on_time <span class=\"token operator\">&amp;&amp;<\/span><br \/>\n                <span class=\"token function\">HAL_GPIO_ReadPin<\/span><span class=\"token punctuation\">(<\/span>BEEP_PORT<span class=\"token punctuation\">,<\/span> BEEP_PIN<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIO_PIN_SET<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token function\">BEEP_Off<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>elapsed <span class=\"token operator\">&gt;&#061;<\/span> beep<span class=\"token punctuation\">.<\/span>off_time <span class=\"token operator\">&amp;&amp;<\/span><br \/>\n                      <span class=\"token function\">HAL_GPIO_ReadPin<\/span><span class=\"token punctuation\">(<\/span>BEEP_PORT<span class=\"token punctuation\">,<\/span> BEEP_PIN<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIO_PIN_RESET<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token function\">BEEP_On<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">default<\/span><span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8bbe\u7f6e\u62a5\u8b66\u72b6\u6001<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">BEEP_SetAlarm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> enable<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>enable<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">BEEP_Blink<\/span><span class=\"token punctuation\">(<\/span>BEEP_ON_TIME<span class=\"token punctuation\">,<\/span> BEEP_ON_TIME<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ 500ms\u5f00&#xff0c;500ms\u5173<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\">DEBUG_MODE<\/span><\/span><br \/>\n        <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[BEEP] Alarm activated\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">BEEP_Off<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        beep<span class=\"token punctuation\">.<\/span>is_active <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\">DEBUG_MODE<\/span><\/span><br \/>\n        <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[BEEP] Alarm deactivated\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u68c0\u67e5\u62a5\u8b66\u662f\u5426\u542f\u7528<\/span><br \/>\n<span class=\"token class-name\">uint8_t<\/span> <span class=\"token function\">BEEP_IsAlarmEnabled<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> beep<span class=\"token punctuation\">.<\/span>is_active<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h3>8. \u4e3b\u51fd\u6570\u6587\u4ef6 main.c<\/h3>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;main.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;dht22.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;oled.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;beep.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;config.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5168\u5c40\u53e5\u67c4<\/span><br \/>\nUART_HandleTypeDef huart1<span class=\"token punctuation\">;<\/span><br \/>\nI2C_HandleTypeDef hi2c1<span class=\"token punctuation\">;<\/span><br \/>\nTIM_HandleTypeDef htim2<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7cfb\u7edf\u72b6\u6001<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">float<\/span> current_temperature<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">float<\/span> current_humidity<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> alarm_status<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> last_sample_time<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> system_uptime<span class=\"token punctuation\">;<\/span><br \/>\n    ErrorCode_t last_error<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> SystemStatus_t<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> SystemStatus_t system_status <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u91cd\u5199fputc\u51fd\u6570&#xff0c;\u652f\u6301printf<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifdef<\/span> <span class=\"token expression\">__GNUC__<\/span><\/span><br \/>\n  <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">PUTCHAR_PROTOTYPE<\/span> <span class=\"token expression\"><span class=\"token keyword\">int<\/span> <span class=\"token function\">__io_putchar<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> ch<span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">else<\/span><\/span><br \/>\n  <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">PUTCHAR_PROTOTYPE<\/span> <span class=\"token expression\"><span class=\"token keyword\">int<\/span> <span class=\"token function\">fputc<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> ch<span class=\"token punctuation\">,<\/span> FILE <span class=\"token operator\">*<\/span>f<span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p>PUTCHAR_PROTOTYPE<br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">HAL_UART_Transmit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>huart1<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>ch<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> HAL_MAX_DELAY<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> ch<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7cfb\u7edf\u65f6\u949f\u914d\u7f6e<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">SystemClock_Config<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    RCC_OscInitTypeDef RCC_OscInitStruct <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    RCC_ClkInitTypeDef RCC_ClkInitStruct <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u914d\u7f6eHSE<\/span><br \/>\n    RCC_OscInitStruct<span class=\"token punctuation\">.<\/span>OscillatorType <span class=\"token operator\">&#061;<\/span> RCC_OSCILLATORTYPE_HSE<span class=\"token punctuation\">;<\/span><br \/>\n    RCC_OscInitStruct<span class=\"token punctuation\">.<\/span>HSEState <span class=\"token operator\">&#061;<\/span> RCC_HSE_ON<span class=\"token punctuation\">;<\/span><br \/>\n    RCC_OscInitStruct<span class=\"token punctuation\">.<\/span>HSEPredivValue <span class=\"token operator\">&#061;<\/span> RCC_HSE_PREDIV_DIV1<span class=\"token punctuation\">;<\/span><br \/>\n    RCC_OscInitStruct<span class=\"token punctuation\">.<\/span>HSIState <span class=\"token operator\">&#061;<\/span> RCC_HSI_ON<span class=\"token punctuation\">;<\/span><br \/>\n    RCC_OscInitStruct<span class=\"token punctuation\">.<\/span>PLL<span class=\"token punctuation\">.<\/span>PLLState <span class=\"token operator\">&#061;<\/span> RCC_PLL_ON<span class=\"token punctuation\">;<\/span><br \/>\n    RCC_OscInitStruct<span class=\"token punctuation\">.<\/span>PLL<span class=\"token punctuation\">.<\/span>PLLSource <span class=\"token operator\">&#061;<\/span> RCC_PLLSOURCE_HSE<span class=\"token punctuation\">;<\/span><br \/>\n    RCC_OscInitStruct<span class=\"token punctuation\">.<\/span>PLL<span class=\"token punctuation\">.<\/span>PLLMUL <span class=\"token operator\">&#061;<\/span> RCC_PLL_MUL9<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">HAL_RCC_OscConfig<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>RCC_OscInitStruct<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> HAL_OK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">Error_Handler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u914d\u7f6e\u7cfb\u7edf\u65f6\u949f<\/span><br \/>\n    RCC_ClkInitStruct<span class=\"token punctuation\">.<\/span>ClockType <span class=\"token operator\">&#061;<\/span> RCC_CLOCKTYPE_HCLK<span class=\"token operator\">|<\/span>RCC_CLOCKTYPE_SYSCLK<br \/>\n                                  <span class=\"token operator\">|<\/span>RCC_CLOCKTYPE_PCLK1<span class=\"token operator\">|<\/span>RCC_CLOCKTYPE_PCLK2<span class=\"token punctuation\">;<\/span><br \/>\n    RCC_ClkInitStruct<span class=\"token punctuation\">.<\/span>SYSCLKSource <span class=\"token operator\">&#061;<\/span> RCC_SYSCLKSOURCE_PLLCLK<span class=\"token punctuation\">;<\/span><br \/>\n    RCC_ClkInitStruct<span class=\"token punctuation\">.<\/span>AHBCLKDivider <span class=\"token operator\">&#061;<\/span> RCC_SYSCLK_DIV1<span class=\"token punctuation\">;<\/span><br \/>\n    RCC_ClkInitStruct<span class=\"token punctuation\">.<\/span>APB1CLKDivider <span class=\"token operator\">&#061;<\/span> RCC_HCLK_DIV2<span class=\"token punctuation\">;<\/span><br \/>\n    RCC_ClkInitStruct<span class=\"token punctuation\">.<\/span>APB2CLKDivider <span class=\"token operator\">&#061;<\/span> RCC_HCLK_DIV1<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">HAL_RCC_ClockConfig<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>RCC_ClkInitStruct<span class=\"token punctuation\">,<\/span> FLASH_LATENCY_2<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> HAL_OK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">Error_Handler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ USART1\u521d\u59cb\u5316<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">MX_USART1_UART_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    huart1<span class=\"token punctuation\">.<\/span>Instance <span class=\"token operator\">&#061;<\/span> USART1<span class=\"token punctuation\">;<\/span><br \/>\n    huart1<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>BaudRate <span class=\"token operator\">&#061;<\/span> UART_BAUDRATE<span class=\"token punctuation\">;<\/span><br \/>\n    huart1<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>WordLength <span class=\"token operator\">&#061;<\/span> UART_WORDLENGTH_8B<span class=\"token punctuation\">;<\/span><br \/>\n    huart1<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>StopBits <span class=\"token operator\">&#061;<\/span> UART_STOPBITS_1<span class=\"token punctuation\">;<\/span><br \/>\n    huart1<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>Parity <span class=\"token operator\">&#061;<\/span> UART_PARITY_NONE<span class=\"token punctuation\">;<\/span><br \/>\n    huart1<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>Mode <span class=\"token operator\">&#061;<\/span> UART_MODE_TX_RX<span class=\"token punctuation\">;<\/span><br \/>\n    huart1<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>HwFlowCtl <span class=\"token operator\">&#061;<\/span> UART_HWCONTROL_NONE<span class=\"token punctuation\">;<\/span><br \/>\n    huart1<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>OverSampling <span class=\"token operator\">&#061;<\/span> UART_OVERSAMPLING_16<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">HAL_UART_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>huart1<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> HAL_OK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">Error_Handler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\">DEBUG_MODE<\/span><\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[UART] Initialized at %d baud\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> UART_BAUDRATE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ I2C1\u521d\u59cb\u5316<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">MX_I2C1_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    hi2c1<span class=\"token punctuation\">.<\/span>Instance <span class=\"token operator\">&#061;<\/span> I2C1<span class=\"token punctuation\">;<\/span><br \/>\n    hi2c1<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>ClockSpeed <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">400000<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    hi2c1<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>DutyCycle <span class=\"token operator\">&#061;<\/span> I2C_DUTYCYCLE_2<span class=\"token punctuation\">;<\/span><br \/>\n    hi2c1<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>OwnAddress1 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    hi2c1<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>AddressingMode <span class=\"token operator\">&#061;<\/span> I2C_ADDRESSINGMODE_7BIT<span class=\"token punctuation\">;<\/span><br \/>\n    hi2c1<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>DualAddressMode <span class=\"token operator\">&#061;<\/span> I2C_DUALADDRESS_DISABLE<span class=\"token punctuation\">;<\/span><br \/>\n    hi2c1<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>OwnAddress2 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    hi2c1<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>GeneralCallMode <span class=\"token operator\">&#061;<\/span> I2C_GENERALCALL_DISABLE<span class=\"token punctuation\">;<\/span><br \/>\n    hi2c1<span class=\"token punctuation\">.<\/span>Init<span class=\"token punctuation\">.<\/span>NoStretchMode <span class=\"token operator\">&#061;<\/span> I2C_NOSTRETCH_DISABLE<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">HAL_I2C_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>hi2c1<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> HAL_OK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">Error_Handler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\">DEBUG_MODE<\/span><\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[I2C] Initialized at 400kHz\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5f15\u811a\u521d\u59cb\u5316<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">GPIO_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    GPIO_InitTypeDef GPIO_InitStruct <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u542f\u7528GPIO\u65f6\u949f<\/span><br \/>\n    <span class=\"token function\">__HAL_RCC_GPIOA_CLK_ENABLE<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">__HAL_RCC_GPIOB_CLK_ENABLE<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ USART1\u5f15\u811a (PA9-TX, PA10-RX)<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Pin <span class=\"token operator\">&#061;<\/span> GPIO_PIN_9 <span class=\"token operator\">|<\/span> GPIO_PIN_10<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Mode <span class=\"token operator\">&#061;<\/span> GPIO_MODE_AF_PP<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Speed <span class=\"token operator\">&#061;<\/span> GPIO_SPEED_FREQ_HIGH<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">HAL_GPIO_Init<\/span><span class=\"token punctuation\">(<\/span>GPIOA<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>GPIO_InitStruct<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ I2C1\u5f15\u811a (PB6-SCL, PB7-SDA)<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Pin <span class=\"token operator\">&#061;<\/span> GPIO_PIN_6 <span class=\"token operator\">|<\/span> GPIO_PIN_7<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Mode <span class=\"token operator\">&#061;<\/span> GPIO_MODE_AF_OD<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Pull <span class=\"token operator\">&#061;<\/span> GPIO_PULLUP<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Speed <span class=\"token operator\">&#061;<\/span> GPIO_SPEED_FREQ_HIGH<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">HAL_GPIO_Init<\/span><span class=\"token punctuation\">(<\/span>GPIOB<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>GPIO_InitStruct<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u7528\u6237LED (PC13)<\/span><br \/>\n    <span class=\"token function\">__HAL_RCC_GPIOC_CLK_ENABLE<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Pin <span class=\"token operator\">&#061;<\/span> GPIO_PIN_13<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Mode <span class=\"token operator\">&#061;<\/span> GPIO_MODE_OUTPUT_PP<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Pull <span class=\"token operator\">&#061;<\/span> GPIO_NOPULL<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStruct<span class=\"token punctuation\">.<\/span>Speed <span class=\"token operator\">&#061;<\/span> GPIO_SPEED_FREQ_LOW<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">HAL_GPIO_Init<\/span><span class=\"token punctuation\">(<\/span>GPIOC<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>GPIO_InitStruct<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7cfb\u7edf\u521d\u59cb\u5316<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">System_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u521d\u59cb\u5316HAL\u5e93<\/span><br \/>\n    <span class=\"token function\">HAL_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u914d\u7f6e\u7cfb\u7edf\u65f6\u949f<\/span><br \/>\n    <span class=\"token function\">SystemClock_Config<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u521d\u59cb\u5316GPIO<\/span><br \/>\n    <span class=\"token function\">GPIO_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u5916\u8bbe<\/span><br \/>\n    <span class=\"token function\">MX_USART1_UART_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">MX_I2C1_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u5404\u6a21\u5757<\/span><br \/>\n    <span class=\"token function\">DHT22_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">OLED_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>hi2c1<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> ERROR_NONE<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[ERROR] OLED initialization failed\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">Error_Handler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token function\">BEEP_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6253\u5370\u542f\u52a8\u4fe1\u606f<\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\r\\\\n&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;STM32 Temperature Monitor System\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Version: 1.0.0\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Compiled: %s %s\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token constant\">__DATE__<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token constant\">__TIME__<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;\\\\r\\\\n\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[SYSTEM] Initialization complete\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[SYSTEM] Alarm threshold: %.1f\u00b0C\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> TEMP_ALARM_THRESHOLD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u91c7\u96c6\u4f20\u611f\u5668\u6570\u636e<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">Sensor_Update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> current_time <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">HAL_GetTick<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u68c0\u67e5\u662f\u5426\u5230\u8fbe\u91c7\u6837\u95f4\u9694<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>current_time <span class=\"token operator\">&#8211;<\/span> system_status<span class=\"token punctuation\">.<\/span>last_sample_time <span class=\"token operator\">&gt;&#061;<\/span> SAMPLE_INTERVAL_MS<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        DHT22_Data_t dht_data<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bfb\u53d6DHT22\u6570\u636e<\/span><br \/>\n        ErrorCode_t error <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">DHT22_ReadData<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>dht_data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>error <span class=\"token operator\">&#061;&#061;<\/span> ERROR_NONE<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            system_status<span class=\"token punctuation\">.<\/span>current_temperature <span class=\"token operator\">&#061;<\/span> dht_data<span class=\"token punctuation\">.<\/span>temperature<span class=\"token punctuation\">;<\/span><br \/>\n            system_status<span class=\"token punctuation\">.<\/span>current_humidity <span class=\"token operator\">&#061;<\/span> dht_data<span class=\"token punctuation\">.<\/span>humidity<span class=\"token punctuation\">;<\/span><br \/>\n            system_status<span class=\"token punctuation\">.<\/span>last_error <span class=\"token operator\">&#061;<\/span> ERROR_NONE<span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u68c0\u67e5\u6e29\u5ea6\u662f\u5426\u8d85\u8fc7\u9608\u503c<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>system_status<span class=\"token punctuation\">.<\/span>current_temperature <span class=\"token operator\">&gt;<\/span> TEMP_ALARM_THRESHOLD<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>system_status<span class=\"token punctuation\">.<\/span>alarm_status<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    system_status<span class=\"token punctuation\">.<\/span>alarm_status <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token function\">BEEP_SetAlarm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u89e6\u53d1\u62a5\u8b66<\/span><br \/>\n                    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[ALARM] Temperature exceeds threshold: %.1f\u00b0C &gt; %.1f\u00b0C\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                           system_status<span class=\"token punctuation\">.<\/span>current_temperature<span class=\"token punctuation\">,<\/span> TEMP_ALARM_THRESHOLD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>system_status<span class=\"token punctuation\">.<\/span>alarm_status<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    system_status<span class=\"token punctuation\">.<\/span>alarm_status <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token function\">BEEP_SetAlarm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u5173\u95ed\u62a5\u8b66<\/span><br \/>\n                    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[ALARM] Temperature back to normal: %.1f\u00b0C\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                           system_status<span class=\"token punctuation\">.<\/span>current_temperature<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u66f4\u65b0\u663e\u793a<\/span><br \/>\n            <span class=\"token function\">OLED_Clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">OLED_DrawTemperature<\/span><span class=\"token punctuation\">(<\/span>system_status<span class=\"token punctuation\">.<\/span>current_temperature<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">OLED_DrawHumidity<\/span><span class=\"token punctuation\">(<\/span>system_status<span class=\"token punctuation\">.<\/span>current_humidity<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">OLED_Update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u4e32\u53e3\u8f93\u51fa\u6570\u636e<\/span><br \/>\n            <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[DATA] Temp&#061;%.1f\u00b0C, Hum&#061;%.1f%%, Alarm&#061;%d\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                   system_status<span class=\"token punctuation\">.<\/span>current_temperature<span class=\"token punctuation\">,<\/span><br \/>\n                   system_status<span class=\"token punctuation\">.<\/span>current_humidity<span class=\"token punctuation\">,<\/span><br \/>\n                   system_status<span class=\"token punctuation\">.<\/span>alarm_status<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            system_status<span class=\"token punctuation\">.<\/span>last_error <span class=\"token operator\">&#061;<\/span> error<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[ERROR] Failed to read DHT22 sensor: %d\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> error<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        system_status<span class=\"token punctuation\">.<\/span>last_sample_time <span class=\"token operator\">&#061;<\/span> current_time<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u66f4\u65b0\u8702\u9e23\u5668\u72b6\u6001<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">System_Update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u66f4\u65b0\u8702\u9e23\u5668\u72b6\u6001<\/span><br \/>\n    <span class=\"token function\">BEEP_Update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u66f4\u65b0\u7cfb\u7edf\u8fd0\u884c\u65f6\u95f4<\/span><br \/>\n    system_status<span class=\"token punctuation\">.<\/span>system_uptime <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">HAL_GetTick<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u7528\u6237LED\u95ea\u70c1\u6307\u793a\u7cfb\u7edf\u8fd0\u884c<\/span><br \/>\n    <span class=\"token keyword\">static<\/span> <span class=\"token class-name\">uint32_t<\/span> led_last_toggle <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">HAL_GetTick<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> led_last_toggle <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">500<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">HAL_GPIO_TogglePin<\/span><span class=\"token punctuation\">(<\/span>GPIOC<span class=\"token punctuation\">,<\/span> GPIO_PIN_13<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        led_last_toggle <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">HAL_GetTick<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u4e3b\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u7cfb\u7edf\u521d\u59cb\u5316<\/span><br \/>\n    <span class=\"token function\">System_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[MAIN] Entering main loop&#8230;\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u4e3b\u5faa\u73af<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u91c7\u96c6\u4f20\u611f\u5668\u6570\u636e<\/span><br \/>\n        <span class=\"token function\">Sensor_Update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u66f4\u65b0\u7cfb\u7edf\u72b6\u6001<\/span><br \/>\n        <span class=\"token function\">System_Update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u7a7a\u95f2\u65f6\u5ef6\u65f6&#xff0c;\u964d\u4f4eCPU\u5360\u7528\u7387<\/span><br \/>\n        <span class=\"token function\">HAL_Delay<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u9519\u8bef\u5904\u7406\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">Error_Handler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[FATAL ERROR] System halted!\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8702\u9e23\u5668\u5feb\u901f\u9e23\u53eb\u6307\u793a\u9519\u8bef<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">BEEP_On<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">HAL_Delay<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">BEEP_Off<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">HAL_Delay<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifdef<\/span> <span class=\"token expression\">USE_FULL_ASSERT<\/span><\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">assert_failed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> <span class=\"token operator\">*<\/span>file<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint32_t<\/span> line<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Assert failed: file %s on line %d\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> file<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">)<\/span>line<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">Error_Handler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<h3>9. main.h \u5934\u6587\u4ef6<\/h3>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifndef<\/span> <span class=\"token expression\">__MAIN_H<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">__MAIN_H<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;stm32f1xx_hal.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u51fd\u6570\u58f0\u660e<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">SystemClock_Config<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">Error_Handler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">System_Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">Sensor_Update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">System_Update<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5916\u8bbe\u53e5\u67c4\u58f0\u660e<\/span><br \/>\n<span class=\"token keyword\">extern<\/span> UART_HandleTypeDef huart1<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">extern<\/span> I2C_HandleTypeDef hi2c1<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">extern<\/span> TIM_HandleTypeDef htim2<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span> <span class=\"token comment\">\/* __MAIN_H *\/<\/span><\/span><\/p>\n<h3>10. \u4f7f\u7528\u8bf4\u660e<\/h3>\n<h4>\u786c\u4ef6\u8fde\u63a5<\/h4>\n<p>STM32F103C8T6 (Blue Pill):<br \/>\n&#8211; PA0   -&gt; DHT22 DATA<br \/>\n&#8211; PA1   -&gt; Buzzer (&#043;)<br \/>\n&#8211; PA9   -&gt; USB-TX (\u901a\u8fc7CH340G)<br \/>\n&#8211; PA10  -&gt; USB-RX (\u901a\u8fc7CH340G)<br \/>\n&#8211; PB6   -&gt; OLED SCL<br \/>\n&#8211; PB7   -&gt; OLED SDA<br \/>\n&#8211; PC13  -&gt; User LED<br \/>\n&#8211; 3.3V  -&gt; DHT22 VCC, OLED VCC<br \/>\n&#8211; GND   -&gt; DHT22 GND, OLED GND, Buzzer (-)<\/p>\n<h4>\u7f16\u8bd1\u548c\u4e0b\u8f7d<\/h4>\n<li>\u4f7f\u7528STM32CubeMX\u751f\u6210\u5de5\u7a0b\u6846\u67b6<\/li>\n<li>\u5c06\u4e0a\u8ff0\u6587\u4ef6\u6dfb\u52a0\u5230\u5de5\u7a0b\u4e2d<\/li>\n<li>\u914d\u7f6e\u6b63\u786e\u7684\u5305\u542b\u8def\u5f84<\/li>\n<li>\u7f16\u8bd1\u5e76\u4e0b\u8f7d\u5230STM32<\/li>\n<h4>\u529f\u80fd\u8bf4\u660e<\/h4>\n<li>\u6570\u636e\u91c7\u96c6&#xff1a;\u6bcf2\u79d2\u91c7\u96c6\u4e00\u6b21\u6e29\u6e7f\u5ea6\u6570\u636e<\/li>\n<li>\u663e\u793a&#xff1a;\u5b9e\u65f6\u5728OLED\u4e0a\u663e\u793a\u6e29\u5ea6\u548c\u6e7f\u5ea6<\/li>\n<li>\u62a5\u8b66&#xff1a;\u6e29\u5ea6\u8d85\u8fc730\u00b0C\u65f6\u89e6\u53d1\u8702\u9e23\u5668\u62a5\u8b66<\/li>\n<li>\u901a\u4fe1&#xff1a;\u901a\u8fc7\u4e32\u53e3(115200)\u8f93\u51fa\u6570\u636e\u5230\u4e0a\u4f4d\u673a<\/li>\n<li>\u9519\u8bef\u5904\u7406&#xff1a;\u5305\u542b\u5b8c\u5584\u7684\u9519\u8bef\u68c0\u6d4b\u548c\u5904\u7406\u673a\u5236<\/li>\n<h4>\u4e0a\u4f4d\u673a\u901a\u4fe1\u683c\u5f0f<\/h4>\n<p>[DATA] Temp&#061;25.5\u00b0C, Hum&#061;60.2%, Alarm&#061;0<br \/>\n[ALARM] Temperature exceeds threshold: 31.2\u00b0C &gt; 30.0\u00b0C<br \/>\n[ERROR] Failed to read DHT22 sensor: 1<\/p>\n<h3>\u6269\u5c55\u5efa\u8bae<\/h3>\n<li>\u6dfb\u52a0\u6309\u952e&#xff1a;\u7528\u4e8e\u624b\u52a8\u5173\u95ed\u62a5\u8b66\u6216\u8c03\u6574\u9608\u503c<\/li>\n<li>\u6570\u636e\u8bb0\u5f55&#xff1a;\u6dfb\u52a0SD\u5361\u6a21\u5757\u5b58\u50a8\u5386\u53f2\u6570\u636e<\/li>\n<li>\u7f51\u7edc\u4f20\u8f93&#xff1a;\u6dfb\u52a0ESP8266 WiFi\u6a21\u5757\u4e0a\u4f20\u6570\u636e\u5230\u4e91\u7aef<\/li>\n<li>\u4f4e\u529f\u8017\u6a21\u5f0f&#xff1a;\u4f7f\u7528STM32\u7684\u4f4e\u529f\u8017\u7279\u6027\u5ef6\u957f\u7535\u6c60\u4f7f\u7528\u65f6\u95f4<\/li>\n<li>\u591a\u4f20\u611f\u5668&#xff1a;\u6dfb\u52a0\u5149\u7167\u3001\u6c14\u538b\u7b49\u4f20\u611f\u5668<\/li>\n","protected":false},"excerpt":{"rendered":"<p>STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801\u5de5\u7a0b\u7ed3\u67841. \u914d\u7f6e\u6587\u4ef6 config.h2. DHT22 \u9a71\u52a8\u6587\u4ef6 dht22.h3. DHT22 \u9a71\u52a8\u6587\u4ef6 dht22.c4. OLED \u9a71\u52a8\u6587\u4ef6 oled.h5. OLED \u9a71\u52a8\u6587\u4ef6 oled.c6. \u8702\u9e23\u5668\u9a71\u52a8\u6587\u4ef6 beep.h7. \u8702\u9e23\u5668\u9a71\u52a8\u6587\u4ef6 beep.c8. \u4e3b\u51fd\u6570\u6587\u4ef6 main.c9. main.h \u5934\u6587\u4ef610. \u4f7f\u7528\u8bf4\u660e\u786c\u4ef6\u8fde\u63a5\u7f16\u8bd1\u548c\u4e0b\u8f7d\u529f\u80fd\u8bf4\u660e\u4e0a\u4f4d\u673a\u901a\u4fe1\u683c\u5f0f\u6269\u5c55\u5efa\u8baeSTM32\u667a\u80fd\u6e29\u6e7f\u5ea6<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[217,270,269],"topic":[],"class_list":["post-60887","post","type-post","status-publish","format-standard","hentry","category-server","tag-stm32","tag-270","tag-269"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/60887.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801\u5de5\u7a0b\u7ed3\u67841. \u914d\u7f6e\u6587\u4ef6 config.h2. DHT22 \u9a71\u52a8\u6587\u4ef6 dht22.h3. DHT22 \u9a71\u52a8\u6587\u4ef6 dht22.c4. OLED \u9a71\u52a8\u6587\u4ef6 oled.h5. OLED \u9a71\u52a8\u6587\u4ef6 oled.c6. \u8702\u9e23\u5668\u9a71\u52a8\u6587\u4ef6 beep.h7. \u8702\u9e23\u5668\u9a71\u52a8\u6587\u4ef6 beep.c8. \u4e3b\u51fd\u6570\u6587\u4ef6 main.c9. main.h \u5934\u6587\u4ef610. \u4f7f\u7528\u8bf4\u660e\u786c\u4ef6\u8fde\u63a5\u7f16\u8bd1\u548c\u4e0b\u8f7d\u529f\u80fd\u8bf4\u660e\u4e0a\u4f4d\u673a\u901a\u4fe1\u683c\u5f0f\u6269\u5c55\u5efa\u8baeSTM32\u667a\u80fd\u6e29\u6e7f\u5ea6\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/60887.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-16T07:25:34+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/60887.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/60887.html\",\"name\":\"STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-01-16T07:25:34+00:00\",\"dateModified\":\"2026-01-16T07:25:34+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/60887.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/60887.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/60887.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/60887.html","og_locale":"zh_CN","og_type":"article","og_title":"STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801\u5de5\u7a0b\u7ed3\u67841. \u914d\u7f6e\u6587\u4ef6 config.h2. DHT22 \u9a71\u52a8\u6587\u4ef6 dht22.h3. DHT22 \u9a71\u52a8\u6587\u4ef6 dht22.c4. OLED \u9a71\u52a8\u6587\u4ef6 oled.h5. OLED \u9a71\u52a8\u6587\u4ef6 oled.c6. \u8702\u9e23\u5668\u9a71\u52a8\u6587\u4ef6 beep.h7. \u8702\u9e23\u5668\u9a71\u52a8\u6587\u4ef6 beep.c8. \u4e3b\u51fd\u6570\u6587\u4ef6 main.c9. main.h \u5934\u6587\u4ef610. \u4f7f\u7528\u8bf4\u660e\u786c\u4ef6\u8fde\u63a5\u7f16\u8bd1\u548c\u4e0b\u8f7d\u529f\u80fd\u8bf4\u660e\u4e0a\u4f4d\u673a\u901a\u4fe1\u683c\u5f0f\u6269\u5c55\u5efa\u8baeSTM32\u667a\u80fd\u6e29\u6e7f\u5ea6","og_url":"https:\/\/www.wsisp.com\/helps\/60887.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-01-16T07:25:34+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"18 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/60887.html","url":"https:\/\/www.wsisp.com\/helps\/60887.html","name":"STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-01-16T07:25:34+00:00","dateModified":"2026-01-16T07:25:34+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/60887.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/60887.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/60887.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"STM32\u667a\u80fd\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u7cfb\u7edf\u5b8c\u6574\u4ee3\u7801"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/60887","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=60887"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/60887\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=60887"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=60887"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=60887"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=60887"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}