超碰在线91,国产第1页,国产精品99,最近中文字幕av

<video id="z2k50"><ins id="z2k50"></ins></video><small id="z2k50"><pre id="z2k50"><samp id="z2k50"></samp></pre></small>

    1. <video id="z2k50"><ins id="z2k50"></ins></video>

        兩個MCU之間的串口通信實(shí)例

        發(fā)布時間:2024-06-04
        串口通信是一種在嵌入式系統(tǒng)中常用的數(shù)據(jù)傳輸方式。在嵌入式系統(tǒng)中,通常需要將一個設(shè)備與另一個設(shè)備進(jìn)行數(shù)據(jù)交換,比如將傳感器獲取的數(shù)據(jù)發(fā)送給mcu進(jìn)行處理或者將mcu處理的結(jié)果發(fā)送給外部波特率需要相同。在本文中,我們將介紹兩個mcu之間的串口通信實(shí)例。
        首先,我們需要準(zhǔn)備兩個mcu:stm32f103和atmega16。我們將使用stm32f103作為主機(jī),atmega16作為從機(jī)。這兩個mcu都具有串口通信功能,可以實(shí)現(xiàn)數(shù)據(jù)的傳輸。
        在這個實(shí)例中,我們將使用usart1作為主機(jī)串口通信,將usart0作為從機(jī)串口通信。在stm32f103上,我們需要配置usart1的引腳,以便與atmega16通信。具體的引腳配置如下:
        usart1_tx -> gpioa_pin9
        usart1_rx -> gpioa_pin10
        在atmega16上,我們將使用usart0作為串口通信。引腳配置如下:
        usart0_tx -> pd1
        usart0_rx -> pd0
        接下來,我們需要為這兩個mcu編寫相應(yīng)的代碼,以實(shí)現(xiàn)串口通信。在stm32f103上,我們將使用hal庫進(jìn)行編程。具體代碼如下:
        ```c
        #include stm32f1xx_hal.h
        uart_handletypedef huart1;
        void systemclock_config(void);
        static void mx_gpio_init(void);
        static void mx_usart1_uart_init(void);
        void error_handler(void);
        int main(void)
        {
        hal_init();
        systemclock_config();
        mx_gpio_init();
        mx_usart1_uart_init();
        uint8_t txdata[] = hello stm32f103!\n;
        hal_uart_transmit(&huart1, txdata, sizeof(txdata), 100);
        while (1)
        {
        }
        }
        void systemclock_config(void)
        {
        rcc_oscinittypedef rcc_oscinitstruct;
        rcc_clkinittypedef rcc_clkinitstruct;
        rcc_oscinitstruct.oscillatortype = rcc_oscillatortype_hse;
        rcc_oscinitstruct.hsestate = rcc_hse_on;
        rcc_oscinitstruct.pll.pllstate = rcc_pll_on;
        rcc_oscinitstruct.pll.pllsource = rcc_pllsource_hse;
        rcc_oscinitstruct.pll.pllmul = rcc_pll_mul9;
        if (hal_rcc_oscconfig(&rcc_oscinitstruct) != hal_ok)
        {
        error_handler();
        }
        rcc_clkinitstruct.clocktype = rcc_clocktype_hclk|rcc_clocktype_sysclk
        |rcc_clocktype_pclk1|rcc_clocktype_pclk2;
        rcc_clkinitstruct.sysclksource = rcc_sysclksource_pllclk;
        rcc_clkinitstruct.ahbclkdivider = rcc_sysclk_div1;
        rcc_clkinitstruct.apb1clkdivider = rcc_hclk_div2;
        rcc_clkinitstruct.apb2clkdivider = rcc_hclk_div1;
        if (hal_rcc_clockconfig(&rcc_clkinitstruct, flash_latency_2) != hal_ok)
        {
        error_handler();
        }
        __hal_rcc_afio_clk_enable();
        }
        static void mx_usart1_uart_init(void)
        {
        huart1.instance = usart1;
        huart1.init.baudrate = 9600;
        huart1.init.wordlength = uart_wordlength_8b;
        huart1.init.stopbits = uart_stopbits_1;
        huart1.init.parity = uart_parity_none;
        huart1.init.mode = uart_mode_tx_rx;
        huart1.init.hwflowctl = uart_hwcontrol_none;
        huart1.init.oversampling = uart_oversampling_16;
        if (hal_uart_init(&huart1) != hal_ok)
        {
        error_handler();
        }
        }
        static void mx_gpio_init(void)
        {
        gpio_inittypedef gpio_initstruct = {0};
        __hal_rcc_gpioa_clk_enable();
        hal_gpio_writepin(gpioa, gpio_pin_9, gpio_pin_reset);
        gpio_initstruct.pin = gpio_pin_9|gpio_pin_10;
        gpio_initstruct.mode = gpio_mode_af_pp;
        gpio_initstruct.speed = gpio_speed_freq_high;
        hal_gpio_init(gpioa, &gpio_initstruct);
        }
        void error_handler(void)
        {
        }
        ```
        在atmega16上,我們將使用avr-gcc進(jìn)行編程。具體代碼如下:
        ```c
        #include
        #include
        void usart_init(void);
        void usart_send(uint8_t data);
        uint8_t usart_receive(void);
        int main(void)
        {
        usart_init();
        while (1)
        {
        uint8_t rxdata = usart_receive();
        if (rxdata == 'h')
        {
        uint8_t txdata[] = hello atmega16!\n;
        for (int i=0;i usart_send(txdata[i]);
        }
        }
        }
        void usart_init(void)
        {
        ubrrl = 25;
        ucsrb = (1< ucsrc = (1<}
        void usart_send(uint8_t data)
        {
        while (!(ucsra & (1< udr = data;
        }
        uint8_t usart_receive(void)
        {
        while (!(ucsra & (1< return udr;
        }
        ```
        以上代碼實(shí)現(xiàn)了stm32f103向atmega16發(fā)送數(shù)據(jù)的功能。在atmega16的串口接收中,當(dāng)收到'h'時,會回復(fù)一條hello atmega16!。這樣,我們就完成了兩個mcu之間的串口通信實(shí)例。
        總結(jié):串口通信在嵌入式系統(tǒng)中是一種常用的數(shù)據(jù)傳輸方式。我們可以通過不同mcu之間的串口通信來實(shí)現(xiàn)不同的數(shù)據(jù)傳輸功能。在實(shí)際應(yīng)用中,還需要注意gpio引腳的配置以及數(shù)據(jù)格式的處理等問題。
        上一個:非接觸式細(xì)胞粉碎機(jī)一次可同時檢測多個樣品哦!
        下一個:滄州耐溫通風(fēng)軟連接銷售廠家,景文技術(shù)員為您指點(diǎn)迷津!

        TCO-PEG4-biotin CAS:2183440-30-2 純度
        德國hainbuch夾緊缸
        可有人知曉污泥分離車其特點(diǎn)的?
        購買新茶如何防上當(dāng)
        什么人不適合喝綠茶
        高純氮?dú)獍l(fā)生器的使用及注意事項(xiàng)
        工程欠款起訴程序
        聯(lián)想s400更換固態(tài)硬盤和內(nèi)存條(聯(lián)想s400升級改造)
        亞硝酸鹽會致癌?它可有點(diǎn)冤!
        五臺山門票優(yōu)惠政策及價格