最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

STM32 設(shè)置I2C從機模式DMA中斷接收

2023-04-03 00:57 作者:我就是LYM  | 我要投稿

周末擺弄了一天,被各種垃圾文檔啥的淹沒不知所措,自己最后研究出來了之后不知道發(fā)哪,想來想去發(fā)B站專欄得了。(強烈需求專欄支持markdown)

需求是這樣的:俺手里有一個STM32F407 開發(fā)板(以下簡稱STM32),還有一個樹莓派PICO(以下簡稱樹莓派),想試一下兩者通過I2C進行數(shù)據(jù)對發(fā)。俺尋思把STM32作為從機,樹莓派作為主機,使用樹莓派每100ms發(fā)送消息給從機,從機接收。

硬件連線如下

硬件連接


樹莓派代碼如下(基于micropython)

注意地址需要和STM32的一致

STM32 CUBEMX生成器管腳配置如圖

STM32管腳配置圖(沒截圖到的都是沒配置的)
I2C的參數(shù)配置
I2C中斷打開event中斷
配置I2C的DMA

【用來和上位機通信的UART配置,不需要的話可以不管】

這里實現(xiàn)的是爛大街的空閑中斷接收任意長度的UART

UART配置
打開中斷(用于實現(xiàn)任意長度接收)
配置UART的DMA

STM32代碼部分:

包含stdio.h
定義接收用的相關(guān)變量
重定向printf到UART(不向上位機輸出可以不定義)
主函數(shù)內(nèi)代碼

【重點】在stm32f4xx_it.c中

在DMA中斷服務(wù)函數(shù)結(jié)束后進行后續(xù)處理
UART的可以放到前面

【附錄】:在main.h中做如下的extern

方便在中斷中去調(diào)用相關(guān)變量

運行結(jié)果:串口打印:

串口打印證明OK

樹莓派代碼源碼如下:

from machine import I2C,Pin

from utime import sleep



i2c= I2C(0,sda=Pin(0),scl=Pin(1),freq=100000)


buf = b'this is i2c hello'



if __name__ == '__main__':

? ? while True:

? ? ? ? i2c.writeto(32,buf)

? ? ? ? print('send buf')

? ? ? ? sleep(0.1)


STM32重要代碼塊如下:

main.c內(nèi)

/* USER CODE BEGIN Includes */

#include "stdio.h"

/* USER CODE END Includes */


/* USER CODE BEGIN PV */

uint8_t receive_num;

uint8_t i2c_receive_num;

uint8_t u1_rec_buf[MAX_BUF];

uint8_t i2c_rec_buf[MAX_BUF];

/* USER CODE END PV */

/* USER CODE BEGIN PFP */

#pragma import(__use_no_semihosting)? ? ? ? ? ? ?

? ? ? ? ? ??

struct __FILE {

int handle;?

};?

FILE __stdout;? ? ? ?


void _sys_exit(int x){?

x = x;?

}?


int fputc(int ch, FILE* stream)

{

HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFFF);

return ch;

}

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

extern DMA_HandleTypeDef hdma_i2c1_rx;


/* USER CODE END 0 */

/* USER CODE BEGIN 2 */


__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);

HAL_UART_Receive_DMA(&huart1,u1_rec_buf,MAX_BUF);


HAL_I2C_Slave_Receive_DMA(&hi2c1,i2c_rec_buf,MAX_BUF);

printf("ALL INIT OK\n");

printf("I2C1 WORKMODE %d\n",HAL_I2C_GetMode(&hi2c1));

? /* USER CODE END 2 */

main.h內(nèi)

/* USER CODE BEGIN EC */

#define MAX_BUF 200

extern uint8_t u1_rec_buf[];

extern uint8_t receive_num;

extern uint8_t i2c_receive_num;

extern uint8_t i2c_rec_buf[];

/* USER CODE END EC */

stm32f4xx_it.c內(nèi)

void DMA1_Stream0_IRQHandler(void)

{

? /* USER CODE BEGIN DMA1_Stream0_IRQn 0 */

? /* USER CODE END DMA1_Stream0_IRQn 0 */

? HAL_DMA_IRQHandler(&hdma_i2c1_rx);

? /* USER CODE BEGIN DMA1_Stream0_IRQn 1 */

i2c_receive_num = MAX_BUF-__HAL_DMA_GET_COUNTER(&hdma_i2c1_rx);

printf("Receive : %d\n",i2c_receive_num);

printf("%s\n",i2c_rec_buf);

HAL_I2C_Slave_Receive_DMA(&hi2c1,i2c_rec_buf,MAX_BUF);

? /* USER CODE END DMA1_Stream0_IRQn 1 */

}


void USART1_IRQHandler(void)

{

? /* USER CODE BEGIN USART1_IRQn 0 */

if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)==SET)? ?

{

__HAL_UART_CLEAR_IDLEFLAG(&huart1);? ? ? ? ? ? ? ? ? ? ?

HAL_UART_DMAStop(&huart1);?

receive_num=MAX_BUF-__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);

HAL_UART_Receive_DMA(&huart1,u1_rec_buf,MAX_BUF);

}

? /* USER CODE END USART1_IRQn 0 */

? HAL_UART_IRQHandler(&huart1);

? /* USER CODE BEGIN USART1_IRQn 1 */


? /* USER CODE END USART1_IRQn 1 */

}



STM32 設(shè)置I2C從機模式DMA中斷接收的評論 (共 條)

分享到微博請遵守國家法律
乐清市| 靖江市| 怀来县| 邯郸市| 鄂尔多斯市| 孝感市| 灵山县| 高陵县| 社旗县| 乐业县| 苏尼特右旗| 永兴县| 元朗区| 任丘市| 古交市| 达日县| 鄯善县| 汉源县| 彰化市| 拜城县| 乃东县| 广安市| 新宁县| 恩施市| 高淳县| 准格尔旗| 若羌县| 荔波县| 张家界市| 英山县| 古丈县| 绍兴市| 石首市| 北碚区| 乡宁县| 隆子县| 金堂县| 廉江市| 龙川县| 万全县| 石景山区|