五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(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中斷接收的評論 (共 條)

分享到微博請遵守國家法律
阿瓦提县| 错那县| 清镇市| 枝江市| 马关县| 阿克| 石柱| 香河县| 西安市| 南投县| 绥德县| 彭州市| 木里| 高碑店市| 镇远县| 清镇市| 丰原市| 保定市| 梧州市| 陆丰市| 宁晋县| 保定市| 黄大仙区| 惠来县| 马鞍山市| 冀州市| 库车县| 闽清县| 石景山区| 怀远县| 深水埗区| 屯留县| 育儿| 宁蒗| 垣曲县| 靖边县| 清苑县| 鲁甸县| 塔城市| 阿拉尔市| 仙桃市|