{"id":311281,"date":"2020-10-11T15:00:21","date_gmt":"2020-10-11T15:00:21","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=311281"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=311281","title":{"rendered":"STM32F3xx + FreeRTOS. Modbus RTU \u0441 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u043c RS485 \u0438 CRC \u0431\u0435\u0437 \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u0432 \u0438 \u0441\u0435\u043c\u0430\u0444\u043e\u0440\u043e\u0432"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/522960\/\">\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e, \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0432 \u0412\u0423\u0417, \u044f \u043f\u043e\u043f\u0430\u043b \u0432 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0430\u0441\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u0438\u043a\u0438. \u041e\u0434\u043d\u0430 \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u2014 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Modbus RTU Slave \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c STM32. \u0421 \u0433\u0440\u0435\u0445\u043e\u043c \u043f\u043e\u043f\u043e\u043b\u0430\u043c \u044f \u0435\u0451 \u0442\u043e\u0433\u0434\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043b, \u043e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043d\u0430\u0447\u0430\u043b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0442\u044c\u0441\u044f \u043c\u043d\u0435 \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u0430\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0431\u0443 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c FreeRTOS.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2> \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u0412 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u044f \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u0432\u044f\u0437\u043a\u0443 STM32F3xx + FreeRTOS, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0438\u043b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\u041f\u0440\u0438\u0435\u043c\/\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c DMA<\/li>\n<li>\u0412\u043e\u0437\u043c\u043e\u043d\u043e\u0441\u0442\u044c \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 CRC<\/li>\n<li>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 RS485<\/li>\n<li>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0446\u0430 \u043f\u043e\u0441\u044b\u043b\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 USART, \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043c\u0435\u0440\u0430<\/li>\n<\/ul>\n<p>   \u0421\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c, \u0442\u0443\u0442 \u044f \u043d\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0442\u043e\u043a\u043b\u0430 Modbus \u0438 \u043a\u0430\u043a \u0441 \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u0430\u0441\u0442\u0435\u0440, \u043e\u0431 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/www.modbus.org\/docs\/Modbus_Application_Protocol_V1_1b3.pdf\">\u0442\u0443\u0442<\/a> \u0438 <a href=\"https:\/\/habr.com\/ru\/post\/281430\/\">\u0442\u0443\u0442<\/a>.<\/p>\n<h3>\u0424\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/h3>\n<p>   \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u043e\u043c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u043a\u043e\u0434\u0430 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438, \u0445\u043e\u0442\u044f \u0431\u044b \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0449\u043e\u0439 conf.h \u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u043d\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">ModbusRTU_conf.h<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#ifndef MODBUSRTU_CONF_H_INCLUDED #define MODBUSRTU_CONF_H_INCLUDED #include &quot;stm32f30x.h&quot;  extern uint32_t SystemCoreClock;  \/*Registers number in Modbus RTU address space*\/ #define MB_REGS_NUM             4096 \/*Slave address*\/ #define MB_SLAVE_ADDRESS        0x01  \/*Hardware defines*\/ #define MB_USART_BAUDRATE       115200 #define MB_USART_RCC_HZ         64000000  #define MB_USART                USART1 #define MB_USART_RCC            RCC-&gt;APB2ENR #define MB_USART_RCC_BIT        RCC_APB2ENR_USART1EN #define MB_USART_IRQn           USART1_IRQn #define MB_USART_IRQ_HANDLER    USART1_IRQHandler  #define MB_USART_RX_RCC         RCC-&gt;AHBENR #define MB_USART_RX_RCC_BIT     RCC_AHBENR_GPIOAEN #define MB_USART_RX_PORT        GPIOA #define MB_USART_RX_PIN         10 #define MB_USART_RX_ALT_NUM     7  #define MB_USART_TX_RCC         RCC-&gt;AHBENR #define MB_USART_TX_RCC_BIT     RCC_AHBENR_GPIOAEN #define MB_USART_TX_PORT        GPIOA #define MB_USART_TX_PIN         9 #define MB_USART_TX_ALT_NUM     7  #define MB_DMA                  DMA1 #define MB_DMA_RCC              RCC-&gt;AHBENR #define MB_DMA_RCC_BIT          RCC_AHBENR_DMA1EN  #define MB_DMA_RX_CH_NUM        5 #define MB_DMA_RX_CH            DMA1_Channel5 #define MB_DMA_RX_IRQn          DMA1_Channel5_IRQn #define MB_DMA_RX_IRQ_HANDLER   DMA1_Channel5_IRQHandler  #define MB_DMA_TX_CH_NUM        4 #define MB_DMA_TX_CH            DMA1_Channel4 #define MB_DMA_TX_IRQn          DMA1_Channel4_IRQn #define MB_DMA_TX_IRQ_HANDLER   DMA1_Channel4_IRQHandler  \/*Hardware RS485 support 1 - enabled other - disabled  *\/   #define MB_RS485_SUPPORT        0 #if(MB_RS485_SUPPORT == 1) #define MB_USART_DE_RCC         RCC-&gt;AHBENR #define MB_USART_DE_RCC_BIT     RCC_AHBENR_GPIOAEN #define MB_USART_DE_PORT        GPIOA #define MB_USART_DE_PIN         12 #define MB_USART_DE_ALT_NUM     7 #endif  \/*Hardware CRC enable 1 - enabled other - disabled  *\/   #define MB_HARDWARE_CRC     1  #endif \/* MODBUSRTU_CONF_H_INCLUDED *\/<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0435\u0449\u0438:<\/p>\n<ul>\n<li>\u0410\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u0440\u043d\u0441\u0442\u0432\u0430<\/li>\n<li>\u0427\u0430\u0441\u0442\u043e\u0442\u0430 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0438\u043d\u043e\u0432 USART(pin, port, rcc, irq)<\/li>\n<li>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u0430\u043d\u0430\u043b\u043e\u0432 DMA(rcc, irq)<\/li>\n<li>\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\/\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0433\u043e CRC \u0438 RS485<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0436\u0435\u043b\u0435\u0437\u0430<\/h3>\n<p>  \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 CMSIS, \u043d\u0435 \u0438\u0437-\u0437\u0430 \u0440\u0435\u043b\u0438\u0433\u0438\u043e\u0437\u043d\u044b\u0445 \u0443\u0431\u0435\u0436\u0434\u0435\u043d\u0438\u0439, \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0449\u0435 \u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043f\u043e\u0440\u0442\u043e\u0432 \u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u043d\u0438\u0437\u0443.<\/p>\n<p>  \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 USART:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">USART configure<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">    \/*Configure USART*\/     \/*CR1:     -Transmitter\/Receiver enable;     -Receive timeout interrupt enable*\/     MB_USART-&gt;CR1 = 0;     MB_USART-&gt;CR1 |= (USART_CR1_TE | USART_CR1_RE | USART_CR1_RTOIE);     \/*CR2:     -Receive timeout - enable     *\/     MB_USART-&gt;CR2 = 0;      \/*CR3:     -DMA receive enable     -DMA transmit enable     *\/     MB_USART-&gt;CR3 = 0;     MB_USART-&gt;CR3 |= (USART_CR3_DMAR | USART_CR3_DMAT);  #if (MB_RS485_SUPPORT == 1)     \/*Cnfigure RS485*\/      MB_USART-&gt;CR1 |= USART_CR1_DEAT | USART_CR1_DEDT;      MB_USART-&gt;CR3 |= USART_CR3_DEM; #endif       \/*Set Receive timeout*\/      \/\/If baudrate is grater than 19200 - timeout is 1.75 ms     if(MB_USART_BAUDRATE &gt;= 19200)         MB_USART-&gt;RTOR = 0.00175 * MB_USART_BAUDRATE + 1;     else         MB_USART-&gt;RTOR = 35;     \/*Set USART baudrate*\/      \/*Set USART baudrate*\/     uint16_t baudrate = MB_USART_RCC_HZ \/ MB_USART_BAUDRATE;     MB_USART-&gt;BRR = baudrate;      \/*Enable interrupt vector for USART1*\/     NVIC_SetPriority(MB_USART_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);     NVIC_EnableIRQ(MB_USART_IRQn);      \/*Enable USART*\/     MB_USART-&gt;CR1 |= USART_CR1_UE; <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<ol>\n<li>\u0412 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0435 F3, \u043a\u0430\u043a \u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 F0, \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430 \u043f\u0440\u0438 \u0442\u0438\u0448\u0438\u043d\u0435 \u043d\u0430 \u043b\u0438\u043d\u0438\u0438, \u0434\u0430\u043d\u043d\u044b\u0439 \u0442\u0430\u0439\u043c\u0435\u0440 \u043e\u0442\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0433\u043e \u0441\u0442\u043e\u043f-\u0431\u0438\u0442\u0430 \u0438 \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0441\u043b\u0438 \u0431\u044b\u043b \u043f\u0440\u0438\u043d\u044f\u0442 \u0441\u043b\u0435\u0434\u0443\u0431\u0449\u0438\u0439 \u0444\u0440\u0435\u0439\u043c. \u041f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0443 \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0446\u0430 \u043f\u043e\u0441\u044b\u043b\u043a\u0438. \u041a\u0441\u0442\u0430\u0442\u0438, \u0432 F1 \u0441\u0435\u0440\u0438\u0438 \u0442\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435 \u0431\u044b\u043b\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 \u0442\u0430\u0439\u043c\u0435\u0440. \u0412\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0438\u044f \u0431\u0438\u0442\u043e\u043c <i>USART_CR1_RTOIE<\/i> \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 <i>\u0421R1<\/i>. \u0412\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0435 \u0432\u0441\u0435 USART \u043d\u0430 \u0431\u043e\u0440\u0442\u0443 \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0439 \u0447\u0438\u0442\u0430\u0439\u0442\u0435 RM!<\/li>\n<li>\u0422\u0430\u0439\u043c\u0430\u0443\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 <i>RTOR<\/i>. \u0412 \u043d\u0435\u0433\u043e \u0437\u0430\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430 \u0432 \u0431\u0438\u0442\u0430\u0445, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043b\u0438\u043d\u0430 3.5 \u0441\u0438\u043c\u0432\u043e\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043a\u043e\u043d\u0435\u0446 \u043f\u043e\u0441\u044b\u043b\u043a\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e 35 (1 \u0441\u0438\u043c\u0432\u043e\u043b \u2014 8 \u0431\u0438\u0442 + 1 \u0441\u0442\u0430\u0440\u0442 \u0431\u0438\u0442 + 1 \u0441\u0442\u043e\u043f \u0431\u0438\u0442). \u0414\u043b\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0435\u0439 \u0431\u043e\u043b\u044c\u0448\u0435 19200 \u0431\u043e\u0434\/\u0441 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b 1.75 \u043c\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0432 \u0434\u043b\u0438\u043d\u0430\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432:\n<pre><code class=\"cpp\">MB_USART-&gt;RTOR = 0.00175 * MB_USART_BAUDRATE + 1;<\/code><\/pre>\n<\/li>\n<li>\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0443 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u043d\u0438\u044f \u043a\u043e\u043d\u0446\u0430 \u043f\u043e\u0441\u044b\u043b\u043a\u0438 \u0438 \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0442\u0430\u0441\u043a\u0430 OC, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043a\u0430\u043a <i>configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY<\/i> \u0438\u043b\u0438 \u0432\u044b\u0448\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f FreeRTOS \u0442\u0438\u043f\u0430 <b>FromISR<\/b> \u0438 \u0435\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0432\u044b\u0448\u0435, \u043c\u043e\u0433\u0443\u0442 \u0441\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u0432\u0435\u0449\u0438 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u043f\u043e\u043b\u043d\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0442\u0430\u0441\u043a\u0430. \u042d\u0442\u043e\u0442 \u0434\u0435\u0444\u0430\u0439\u043d \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u0432 \u0444\u0430\u0439\u043b\u0435 FreeRTOS_Config.h, \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/www.freertos.org\/a00110.html#kernel_priority\">\u0442\u0443\u0442<\/a><\/li>\n<li>RS485 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u0431\u0438\u0442\u0444\u0438\u043b\u0434\u0430\u043c\u0438: <i>USART_CR1_DEAT<\/i> \u0438 <i>USART_CR1_DEDT<\/i>. \u042d\u0442\u0438 \u0431\u0438\u0442\u0444\u0438\u043b\u0434\u044b \u043f\u043e\u0434\u0432\u043e\u043b\u044f\u044e\u0442 \u0437\u0430\u0434\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0441\u043d\u044f\u0442\u0438\u044f \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 DE \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044f\u0445 1\/16 \u0438\u043b\u0438 1\/8 \u0431\u0438\u0442\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 oversampling \u043c\u043e\u0434\u0443\u043b\u044f USART. \u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 <i>CR3<\/i> \u0431\u0438\u0442\u043e\u043c <i>USART_CR3_DEM<\/i>, \u043e\u0431\u043e \u0432\u0441\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u0441\u044f \u0436\u0435\u043b\u0435\u0437\u043e.<\/li>\n<\/ol>\n<p>  \u041d\u0430\u0442\u0441\u0440\u043e\u0439\u043a\u0430 DMA:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 DMA<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">    \/*Configure DMA Rx\/Tx channels*\/     \/\/Rx channel     \/\/Max priority     \/\/Memory increment     \/\/Transfer complete interrupt     \/\/Transfer error interrupt     MB_DMA_RX_CH-&gt;CCR = 0;     MB_DMA_RX_CH-&gt;CCR |= (DMA_CCR_PL | DMA_CCR_MINC | DMA_CCR_TCIE | DMA_CCR_TEIE);     MB_DMA_RX_CH-&gt;CPAR = (uint32_t)&MB_USART-&gt;RDR;     MB_DMA_RX_CH-&gt;CMAR = (uint32_t)MB_Frame;      \/*Set highest priority to Rx DMA*\/     NVIC_SetPriority(MB_DMA_RX_IRQn, 0);     NVIC_EnableIRQ(MB_DMA_RX_IRQn);      \/\/Tx channel     \/\/Max priority     \/\/Memory increment     \/\/Transfer complete interrupt     \/\/Transfer error interrupt     MB_DMA_TX_CH-&gt;CCR = 0;     MB_DMA_TX_CH-&gt;CCR |= (DMA_CCR_PL | DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_TCIE | DMA_CCR_TEIE);     MB_DMA_TX_CH-&gt;CPAR = (uint32_t)&MB_USART-&gt;TDR;     MB_DMA_TX_CH-&gt;CMAR = (uint32_t)MB_Frame;       \/*Set highest priority to Tx DMA*\/     NVIC_SetPriority(MB_DMA_TX_IRQn, 0);     NVIC_EnableIRQ(MB_DMA_TX_IRQn);<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a Modbus \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0437\u0430\u043f\u0440\u043e\u0441-\u043e\u0442\u0432\u0435\u0442, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0434\u0438\u043d \u0431\u0443\u0444\u0444\u0435\u0440, \u043a\u0430\u043a \u0434\u043b\u044f \u043f\u0440\u0438\u0435\u043c\u0430 \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438. \u0412 \u0431\u0443\u0444\u0444\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438, \u0442\u0430\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0438\u0437 \u043d\u0435\u0433\u043e \u0436\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f. Rx \u043a\u0430\u043d\u0430\u043b DMA \u043a\u043b\u0430\u0434\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u043f\u0440\u0438\u0435\u043c\u0430 USART (RDR) \u0432 \u0431\u0443\u0444\u0435\u0440, Tx \u043a\u0430\u043d\u0430\u043b DMA \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438(TDR). \u041f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 Tx \u043a\u0430\u043d\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u0443\u0448\u0435\u043b \u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c \u043f\u0440\u0438\u0435\u043c\u0430. <\/p>\n<p>  \u041f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 Rx \u043a\u0430\u043d\u0430\u043b\u0430 \u043f\u043e \u0441\u0443\u0442\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0432\u0435\u0434\u044c \u043c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0441\u044b\u043b\u043a\u0430 Modbus \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 256 \u0431\u0430\u0439\u0442, \u043d\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0430 \u043b\u0438\u043d\u0438\u0438 \u0448\u0443\u043c \u0438 \u043a\u0442\u043e-\u0442\u043e \u0431\u0435\u0441\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u043d\u043e \u0448\u043b\u0435\u0442 \u0431\u0430\u0439\u0442\u044b? \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0431\u0443\u0444\u0435\u0440 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 257 \u0431\u0430\u0439\u0442, \u0438 \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043e\u0442 Rx DMA \u0441\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u0437\u043d\u0430\u0447\u0438\u0442, \u043a\u0442\u043e-\u0442\u043e \u00ab\u043c\u0443\u0441\u043e\u0440\u0438\u0442\u00bb \u0432 \u043b\u0438\u043d\u0438\u044e, \u0430 \u043c\u044b \u043f\u0435\u0440\u0435\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c Rx \u043a\u0430\u043d\u0430\u043b \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0431\u0443\u0444\u0444\u0435\u0440\u0430 \u0438 \u0441\u043b\u0443\u0448\u0430\u0435\u043c \u0441\u043d\u043e\u0432\u0430.<\/p>\n<p>  \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">Interrupt handlers<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">\/*DMA Rx interrupt handler*\/ void MB_DMA_RX_IRQ_HANDLER(void) {     if(MB_DMA-&gt;ISR & (DMA_ISR_TCIF1 &lt;&lt; ((MB_DMA_RX_CH_NUM - 1) &lt;&lt; 2)))         MB_DMA-&gt;IFCR |= (DMA_IFCR_CTCIF1 &lt;&lt; ((MB_DMA_RX_CH_NUM - 1) &lt;&lt; 2));     if(MB_DMA-&gt;ISR & (DMA_ISR_TEIF1 &lt;&lt; ((MB_DMA_RX_CH_NUM - 1) &lt;&lt; 2)))         MB_DMA-&gt;IFCR |= (DMA_IFCR_CTEIF1 &lt;&lt; ((MB_DMA_RX_CH_NUM - 1) &lt;&lt; 2));     \/*If error happened on transfer or MB_MAX_FRAME_SIZE bytes received - start listening*\/     MB_RecieveFrame(); }  \/*DMA Tx interrupt handler*\/ void MB_DMA_TX_IRQ_HANDLER(void) {     MB_DMA_TX_CH-&gt;CCR &= ~(DMA_CCR_EN);     if(MB_DMA-&gt;ISR & (DMA_ISR_TCIF1 &lt;&lt; ((MB_DMA_TX_CH_NUM - 1) &lt;&lt; 2)))         MB_DMA-&gt;IFCR |= (DMA_IFCR_CTCIF1 &lt;&lt; ((MB_DMA_TX_CH_NUM - 1) &lt;&lt; 2));     if(MB_DMA-&gt;ISR & (DMA_ISR_TEIF1 &lt;&lt; ((MB_DMA_TX_CH_NUM - 1) &lt;&lt; 2)))         MB_DMA-&gt;IFCR |= (DMA_IFCR_CTEIF1 &lt;&lt; ((MB_DMA_TX_CH_NUM - 1) &lt;&lt; 2));     \/*If error happened on transfer or transfer completed - start listening*\/     MB_RecieveFrame(); }  \/*USART interrupt handler*\/ void MB_USART_IRQ_HANDLER(void) {     BaseType_t xHigherPriorityTaskWoken = pdFALSE;     if(MB_USART-&gt;ISR & USART_ISR_RTOF)     {         MB_USART-&gt;ICR = 0xFFFFFFFF;         \/\/MB_USART-&gt;ICR |= USART_ICR_RTOCF;         MB_USART-&gt;CR2 &= ~(USART_CR2_RTOEN);         \/*Stop DMA Rx channel and get received bytes num*\/         MB_FrameLen = MB_MAX_FRAME_SIZE - MB_DMA_RX_CH-&gt;CNDTR;         MB_DMA_RX_CH-&gt;CCR &= ~DMA_CCR_EN;         \/*Send notification to Modbus Handler task*\/         vTaskNotifyGiveFromISR(MB_TaskHandle, &xHigherPriorityTaskWoken);         portYIELD_FROM_ISR(xHigherPriorityTaskWoken);     } }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 DMA \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0435: \u0432\u0441\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u2014 \u043f\u043e\u0447\u0438\u0441\u0442\u0438 \u0444\u043b\u0430\u0433\u0438, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438 \u0432 \u0440\u0435\u0436\u0438\u043c \u043f\u0440\u0438\u0435\u043c\u0430, \u043f\u0440\u0438\u043d\u044f\u043b 257 \u0431\u0430\u0439\u0442 \u2014 \u043e\u0448\u0438\u0431\u043a\u0430 \u0444\u0440\u0435\u0439\u043c\u0430, \u0447\u0438\u0441\u0442\u0438 \u0432\u043b\u0430\u0433\u0438, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438 \u0432 \u0440\u0435\u0436\u0438\u043c \u043f\u0440\u0438\u0435\u043c\u0430 \u0441\u043d\u043e\u0432\u0430.<\/p>\n<p>  \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a USART \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430\u043c, \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0431\u044b\u043b\u0430 \u0442\u0438\u0448\u0438\u043d\u0430. \u0424\u0440\u0435\u0439\u043c \u0433\u043e\u0442\u043e\u0432, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0445 \u0431\u0430\u0439\u0442 (\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442 \u043f\u0440\u0438\u0435\u043c\u0430 DMA \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u043d\u044f\u0442\u044c), \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u0440\u0438\u0435\u043c, \u0431\u0443\u0434\u0438\u043c \u0442\u0430\u0441\u043a. <\/p>\n<p>  \u041e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441, \u0440\u0430\u043d\u044c\u0448\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0442\u0430\u0441\u043a\u0430 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0441\u0435\u043c\u0430\u0444\u043e\u0440, \u043e\u0434\u043d\u0430\u043a\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 FreeRTOS \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/www.freertos.org\/RTOS_Task_Notification_As_Binary_Semaphore.html\">TaskNotification<\/a>:  <\/p>\n<blockquote><p>Unblocking an RTOS task with a direct notification is 45% faster and uses less RAM than unblocking a task with a binary semaphore  <\/p><\/blockquote>\n<p> \u0418\u043d\u043e\u0433\u0434\u0430 \u0432 <b>FreeRTOS_Config.h<\/b> \u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0432 \u0441\u0431\u043e\u0440\u043a\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <i>xTaskGetCurrentTaskHandle()<\/i>, \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u044d\u0442\u043e\u0439 \u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"cpp\">#define INCLUDE_xTaskGetCurrentTaskHandle 1<\/code><\/pre>\n<p>  \u0411\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u043c\u0430\u0444\u043e\u0440\u0430 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 \u043f\u043e\u0445\u0443\u0434\u0435\u043b\u0430 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 1 \u043a\u0411. \u041c\u0435\u043b\u043e\u0447\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u043e.<\/p>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0438 \u043f\u0440\u0438\u0435\u043c\u0430:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">Send and Receve<\/b>                         <\/p>\n<div class=\"spoiler_text\">\/*Configure DMA to receive mode*\/  <\/p>\n<pre><code class=\"cpp\">void MB_RecieveFrame(void) {     MB_FrameLen = 0;     \/\/Clear timeout Flag*\/     MB_USART-&gt;CR2 |= USART_CR2_RTOEN;     \/*Disable Tx DMA channel*\/     MB_DMA_RX_CH-&gt;CCR &= ~DMA_CCR_EN;     \/*Set receive bytes num to 257*\/     MB_DMA_RX_CH-&gt;CNDTR = MB_MAX_FRAME_SIZE;     \/*Enable Rx DMA channel*\/     MB_DMA_RX_CH-&gt;CCR |= DMA_CCR_EN; }  \/*Configure DMA in tx mode*\/ void MB_SendFrame(uint32_t len) {     \/*Set number of bytes to transmit*\/     MB_DMA_TX_CH-&gt;CNDTR = len;     \/*Enable Tx DMA channel*\/     MB_DMA_TX_CH-&gt;CCR |= DMA_CCR_EN; }<\/code><\/pre>\n<\/div><\/div>\n<p>  \u041e\u0431\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u043a\u0430\u043d\u0430\u043b\u044b DMA. \u041f\u0440\u0438 \u043f\u0440\u0438\u0435\u043c\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 <i>CR2<\/i> \u0431\u0438\u0442\u043e\u043c <i>USART_CR2_RTOEN<\/i>.<\/p>\n<h3>CRC<\/h3>\n<p>  \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0445\u0430\u0440\u0434\u0432\u0430\u0440\u043d\u043e\u043c\u0443 \u0440\u0430\u0441\u0447\u0435\u0442\u0443 CRC. \u0412\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0437\u043e\u043b\u0438\u043b\u0430 \u043c\u043d\u0435 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0433\u043b\u0430\u0437\u0430, \u043d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u043a\u0430\u043a-\u0442\u043e \u043d\u0435 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u043e\u0441\u044c, \u0432 \u043a\u0430\u043a\u043e\u0439 \u0442\u043e \u0441\u0435\u0440\u0438\u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u043d\u043e\u043c, \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0438\u043d\u043e\u043c\u0430 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0412 F3 \u0436\u0435 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u0438 \u043f\u043e\u043b\u0438\u043d\u043e\u043c \u0437\u0430\u0434\u0430\u0432\u0430\u0439 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0435\u043d\u044f\u0439, \u043d\u043e \u043f\u0440\u0438\u0441\u0435\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0434\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c:<\/p>\n<pre><code class=\"cpp\">uint16_t MB_GetCRC(uint8_t * buffer, uint32_t len) {     MB_CRC_Init();     for(uint32_t i = 0; i &lt; len; i++)         *((__IO uint8_t *)&CRC-&gt;DR) = buffer[i];     return CRC-&gt;DR; }<\/code><\/pre>\n<p>  \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u043f\u043e\u0431\u0430\u0439\u0442\u043d\u043e \u0437\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 <i>DR<\/i> \u043d\u0435\u043b\u044c\u0437\u044f \u2014 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u043d\u0430\u0434\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c byte-access. \u0422\u0430\u043a\u0438\u0435 \u00ab\u0432\u044b\u043a\u0440\u0443\u0442\u0430\u0441\u044b\u00bb \u0443 STM \u044f \u0443\u0436\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b \u0441 \u043c\u043e\u0434\u0443\u043b\u0435\u043c SPI \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0431\u0430\u0439\u0442\u043d\u043e. <\/p>\n<h3>\u0422\u0430\u0441\u043a<\/h3>\n<p>  <\/p>\n<pre><code class=\"cpp\">void MB_RTU_Slave_Task(void *pvParameters) {     MB_TaskHandle = xTaskGetCurrentTaskHandle();     MB_HWInit();     while(1)     {         if(ulTaskNotifyTake(pdTRUE, portMAX_DELAY))         {             uint32_t txLen = MB_TransactionHandler(MB_GetFrame(), MB_GetFrameLen());             if(txLen)                 MB_SendFrame(txLen);             else                 MB_RecieveFrame();         }     } }<\/code><\/pre>\n<p>  \u0412 \u043d\u0435\u043c \u043c\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0442\u0430\u0441\u043a, \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 TaskNotification, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0436\u0435\u043b\u0435\u0437\u043e \u0438 \u0436\u0434\u0435\u043c \u0441\u043f\u0438\u043c \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u043c\u043e\u0436\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e <i>portMAX_DELAY<\/i> \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c, \u0447\u0442\u043e \u0441\u0432\u044f\u0437\u0438 \u043d\u0435 \u0431\u044b\u043b\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u0415\u0441\u043b\u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u2014 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0441\u044b\u043b\u043a\u0443, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c, \u0435\u0441\u043b\u0438 \u0436\u0435 \u0444\u0440\u0435\u0439\u043c \u043f\u0440\u0438\u0448\u0435\u043b \u0431\u0438\u0442\u044b\u0439 \u0438\u043b\u0438 \u043d\u0435 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443, \u043f\u0440\u043e\u0441\u0442\u043e \u0436\u0434\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439.<\/p>\n<pre><code class=\"cpp\">\/*Handle Received frame*\/ static uint32_t MB_TransactionHandler(uint8_t * frame, uint32_t len) {     uint32_t txLen = 0;     \/*Check frame length*\/     if(len &lt; MB_MIN_FRAME_LEN)         return txLen;     \/*Check frame address*\/     if(!MB_CheckAddress(frame[0]))         return txLen;     \/*Check frame CRC*\/     if(!MB_CheckCRC(*((uint16_t*)&frame[len - 2]), MB_GetCRC(frame, len - 2)))         return txLen;     switch(frame[1])     {         case MB_CMD_READ_REGS : txLen = MB_ReadRegsHandler(frame, len); break;         case MB_CMD_WRITE_REG : txLen = MB_WriteRegHandler(frame, len); break;         case MB_CMD_WRITE_REGS : txLen = MB_WriteRegsHandler(frame, len); break;         default : txLen = MB_ErrorHandler(frame, len, MB_ERROR_COMMAND); break;     }     return txLen; }<\/code><\/pre>\n<p>  \u0421\u0430\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043b\u0438\u043d\u044b \u0444\u0440\u0435\u0439\u043c\u0430\/\u0430\u0434\u0440\u0435\u0441\u0430\/CRC \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u0438\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0438. \u0414\u0430\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0440\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: 0x03 \u2014 Read Registers, 0x06 \u2014 Write register, 0x10 \u2014 Write Multiple Registers. \u041e\u0431\u044b\u0447\u043d\u043e, \u043c\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043d\u043e \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b.<\/p>\n<p>  \u041d\u0443 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a:<\/p>\n<pre><code class=\"cpp\">int main(void) {     NVIC_SetPriorityGrouping(3);     xTaskCreate(MB_RTU_Slave_Task, &quot;MB&quot;, configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);     vTaskStartScheduler(); }<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0430\u0441\u043a\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0442\u0435\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432 32 x uint32_t (\u0438\u043b\u0438 128 \u0431\u0430\u0439\u0442) \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0443 \u043c\u0435\u043d\u044f \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u0434\u0435\u0444\u0430\u0439\u043d\u0435 <i>configMINIMAL_STACK_SIZE<\/i>. \u0414\u043b\u044f \u0441\u043f\u0440\u0430\u0432\u043a\u0438: \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b, \u0447\u0442\u043e <i>configMINIMAL_STACK_SIZE<\/i> \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0431\u0430\u0439\u0442\u0430\u0445, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b \u0435\u0449\u0435, \u043e\u0434\u043d\u0430\u043a\u043e, \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u0441 F0 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u043c\u0438, \u0433\u0434\u0435 RAM \u043f\u043e\u043c\u0435\u043d\u044c\u0448\u0435, \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0435\u043a \u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e <i>configMINIMAL_STACK_SIZE<\/i> \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044f\u0445 \u0442\u0438\u043f\u0430<i>portSTACK_TYPE<\/i>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u0432 \u0444\u0430\u0439\u043b\u0435 <b>portmacro.h<\/b>   <\/p>\n<pre><code class=\"cpp\">#define portSTACK_TYPE    uint32_t <\/code><\/pre>\n<p>  <\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u0414\u0430\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Modbus RTU \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 STM32F3xx. <\/p>\n<p>  \u0412\u0435\u0441 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u041e\u0421 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 -o2 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b: Program size: 5492 \u0411\u0430\u0439\u0442\u0430, Data size: 112 \u0431\u0430\u0439\u0442. \u041d\u0430 \u0444\u043e\u043d\u0435 6 \u043a\u0411 \u043f\u043e\u0445\u0443\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 1 \u043a\u0411 \u043e\u0442 \u0441\u0435\u043c\u0430\u0444\u043e\u0440\u043e\u0432, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>  \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 F0 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u0438 RS485, \u043e\u0434\u043d\u0430\u043a\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u043c CRC, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0441\u043e\u0444\u0442\u043e\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0440\u0430\u0441\u0447\u0435\u0442\u0430. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u0445 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439 DMA, \u0433\u0434\u0435-\u0442\u043e \u043e\u043d\u0438 \u0431\u044b\u0432\u0430\u044e\u0442 \u0441\u043e\u0432\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>  <a href=\"https:\/\/github.com\/DoHelloWorld\/STM32F3xx_FreeRTOS_ModbusRTU_RS485\/tree\/master\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431<\/a><\/p>\n<p>  \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f.<\/p>\n<p>  \u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.st.com\/resource\/en\/reference_manual\/dm00043574-stm32f303xbcde-stm32f303x68-stm32f328x8-stm32f358xc-stm32f398xe-advanced-armbased-mcus-stmicroelectronics.pdf\">STM32F303 Reference Manua<\/a>l<\/li>\n<li><a href=\"https:\/\/www.modbus.org\/docs\/Modbus_Application_Protocol_V1_1b3.pdf\">Modbus Specification<\/a><\/li>\n<\/ul>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/522960\/\"> https:\/\/habr.com\/ru\/post\/522960\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/522960\/\">\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e, \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0432 \u0412\u0423\u0417, \u044f \u043f\u043e\u043f\u0430\u043b \u0432 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0430\u0441\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u0438\u043a\u0438. \u041e\u0434\u043d\u0430 \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u2014 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Modbus RTU Slave \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c STM32. \u0421 \u0433\u0440\u0435\u0445\u043e\u043c \u043f\u043e\u043f\u043e\u043b\u0430\u043c \u044f \u0435\u0451 \u0442\u043e\u0433\u0434\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043b, \u043e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043d\u0430\u0447\u0430\u043b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0442\u044c\u0441\u044f \u043c\u043d\u0435 \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u0430\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0431\u0443 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c FreeRTOS.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-311281","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/311281","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=311281"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/311281\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=311281"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=311281"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=311281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}