stm32 相关问题

STM32是ST Microelectronics的一系列微控制器,基于Cortex M0,M0 +,M3,M4或M7 ARM内核(取决于产品系列)。

使用寄存器的STM32F401xx I2C驱动程序

我想在proteus中使用两个STM32F401xx MCU。其一为主人,其二为奴隶。 这是我给主人的代码: 使用(MicroC Pro For Arm)程序。 #包括 我想在STM32F401xx MCU中使用两个proteus。其中一个是成为 master,另一个是成为 slave。 这是我给大师的代码: 使用 (MicroC Pro For Arm) 程序。 #include <stdint.h> #include <stdio.h> uint8_t temp=0; void begin(uint8_t addr); void end(void); void Write (uint8_t dat); void main() { // Enable the I2C CLOCK and GPIO CLOCK RCC_APB1ENR |= (1<<21); // enable I2C CLOCK RCC_AHB1ENR |= (1<<1); // Enable GPIOB CLOCK // Configure the I2C PINs for ALternate Functions //PB8 and PB9 are connected to I2C1_SCL and I2C1_SDA GPIOB_MODER |= (2<<16) | (2<<18); GPIOB_OTYPER |= (1<<8) | (1<<9); GPIOB_OSPEEDR |= (3<<16) | (3<<18); GPIOB_PUPDR |= (1<<16) | (1<<18); GPIOB_AFRH |= (4<<0) | (4<<4); begin(0x08); Write(0x01); end(); } void begin(uint8_t addr){ //join I2C as a master mode //Generate a start condition I2C1_CR1 |= (1<<10); // Enable the ACK I2C1_CR1 |= (1<<8); // Generate START while (!(I2C1_SR1 & (1<<0))); // Wait for SB bit to set to 1 //Send the Slave Address to the DR Register I2C1_DR = addr; // send the address while (!(I2C1_SR1 & (1<<1))); // temp = I2C1_SR1 | I2C1_SR2; // read SR1 and SR2 to clear the ADDR bit // Reset the I2C I2C1_CR1 |= (1<<15); //I2C Peripheral under reset state -->page.493 manual I2C1_CR1 &= ~(1<<15); //I2C Peripheral not under reset -->page.493 manual // Program the peripheral input clock in I2C_CR2 Register in order to generate correct timings I2C1_CR2 |= (42 <<0); // PCLK1 FREQUENCY in MHz I2C1_CCR = 210<<0; // Configure the clock control registers I2C1_TRISE = 43; // Configure the rise time register I2C1_CR1 |= (1<<0); // Enable I2C } void end(void) { I2C1_CR1 |= (1<<9);//stop generation // Wait until the STOP condition is complete while (I2C1_SR2 & (1<<0)); //Cleared by hardware after detecting a Stop condition on the bus // Clear the STOP bit I2C1_CR1 &= ~(1<<9); } void Write (uint8_t dat) { while (!(I2C1_SR1 & (1<<7))); // wait for TXE bit to set I2C1_DR = dat ; // wait for BTF bit to set while (!(I2C1_SR1 & (1<<2))); //waiting while BTF=0 but when BTF=1; Data byte transfer succeeded } 从机代码: #include <stdint.h> #include <stdio.h> uint8_t temp=0; uint8_t state =0x00; void begin(uint8_t addr); void end(void); uint8_t Read (); void main() { RCC_APB1ENR |= (1<<21); // enable I2C CLOCK - RCC_AHB1ENR |= (1<<1); // Enable GPIOB CLOCK RCC_AHB1ENR |= (1<<0); // Enable GPIOA CLOCK GPIOA_MODER |=(1<<0); //set pin 0 as output // Configure the I2C PINs for ALternate Functions //PB8 and PB9 are connected to I2C1_SCL and I2C1_SDA GPIOB_MODER |= (2<<16) | (2<<18); GPIOB_OTYPER |= (1<<8) | (1<<9); GPIOB_OSPEEDR |= (3<<16) | (3<<18); GPIOB_PUPDR |= (1<<16) | (1<<18); GPIOB_AFRH |= (4<<0) | (4<<4); begin(0x08); state = Read(); end(); if (state == 0x01){ GPIOA_ODR |=(1<<0);//set 1 for pin 0 } } void begin(uint8_t addr){ //join I2C bus as a slave mode I2C1_CR2 |= (42<<0); // PCLK1 FREQUENCY in MHz I2C1_OAR1 = addr;//own address interface I2C1_CR1 |= (1<<0); // Enable I2C I2C1_CR1 |= (1<<10); // Enable the ACK ,indicate that a byte is received } void end(void) { I2C1_CR1 |= (1<<9);//stop generation // Wait until the STOP condition is complete while (I2C1_SR2 & (1<<0)); //Cleared by hardware after detecting a Stop condition on the bus // Clear the STOP bit I2C1_CR1 &= ~(1<<9); } uint8_t Read (){ uint8_t receivedData = 0; I2C1_CR1 &= ~(1<<10); // clear the ACK bit temp = I2C1_SR1 | I2C1_SR2; // read SR1 and SR2 to clear the ADDR bit.... EV6 condition I2C1_CR1 |= (1<<9); // Stop I2C while (!(I2C1_SR1 & (1<<6))); // wait for RxNE to set receivedData = I2C1_DR; // Read the data from the DATA REGISTER return receivedData; } 我尝试在Proteus上进行模拟,但是没有什么可以改变的,led still off。所以,我想知道如何在Proteus上制作simulation,如果我提供的代码有任何问题,我按照STM32F401xx的datasheet和manual来编写这个简单的驱动程序。 proteus 两个 STM32F401xx MCU 的连接: 你的主人的“开始”功能做了一些奇怪的事情。 I2C1_TRISE = 43; after 设置起始位怎么样?您在配置之前尝试使用 I2C。在使用任何应答或起始位之前,TRISE 必须是对 I2C 执行的首要操作之一。整个函数以奇怪的顺序执行操作。 寄存器中的“起始位”不启用起始位功能。当您写入时,它实际上会尝试立即发送一个起始位,并且在您的代码中,它会在您设置 TRISE 之前甚至在启用 I2C 外设之前发生。因此,行为是不可预测的。 我检查了F401的外设,它与F103的外设一模一样,只是F401多了一个用于模拟和数字噪声滤波器控制的寄存器。除此之外,它们是相同的并且完美地映射到另一个。 (根据勘误表,F401 不存在与 F103 相同的带有滤波器故障的硅缺陷)。 以下是我使用该外设的操作顺序,跳过了明显的 GPIO 备用功能设置,因此此处仅注册 I2C。这是 I2C 主设备配置,但一般设置是相同的,从设备配置和主设备配置之间的区别在于以下必要步骤: 配置GPIO,使能I2C时钟。 将CR2中的FREQ配置为APBx时钟频率(例如STM32运行在64MHz时为32,因为I2C的APBx运行在32000000Hz) 在CCR中配置时钟周期倍频器 配置 TRISE 的上升/下降时间 现在,如果您写入起始位,您可以将数据加载到 DR 并将其作为主设备发送。到目前为止,您不需要向 Start 位写入任何内容,也不需要向 ACK 位写入任何内容,这些位用于正在进行的通信,而不是用于配置。 对于从机,您可以进行类似的设置,但显然还需要配置其从机地址。 我觉得你太着急了。从主 MCU 开始,确保您首先可以在 I2C 线路上看到一些内容。

回答 1 投票 0

在STM32CubeIDE中通过标准CAN总线发送超过8个字节

我想通过 STM32CudeIDE 中的标准 CAN 总线发送超过 8 个字节,但我不知道该怎么做:我正在发送三个浮点值,其中每个浮点为 4 个字节。前两个

回答 1 投票 0

计算 RTOS 应用程序中的堆栈使用情况

我目前正在开展一个项目,使用 RTOS (micrium) 在 STM32 微控制器中开发应用程序。 是否有任何工具可以计算 RTOS 应用程序中特定线程的堆栈使用情况...

回答 2 投票 0

使用定时器更新中断时,while 循环不起作用

我使用的是 stm32g030f6 微控制器,我想每 1 秒切换一次 LED。 这是我的代码 #include“main.h” uint8_t cnt = 0; 布尔发送=假; HAL_UART_RxCpltCallback(

回答 1 投票 0

FreeRTOS 的 StreamBuffer 未启动

Freertos StreamBuffer 似乎在我使用以下命令创建它时挂起: StreamBufferHandle = xStreamBufferCreate(3,10); IM 使用 stm32h743 mcu 和 CubeMX 在 KEIL uvision 编译器中生成的代码。 我...

回答 1 投票 0

stm32 C 全局变量没有初始化值

正在开发一块EVAL板stm32G474RE,其闪存为512K,RAM为128K。 EVAL 板上一切正常。现在我们收到了实际的硬件,这是一个stm32g474CBU。非常...

回答 1 投票 0

如何在stm32中使用外部adc输出读取16位并行数据

我在 stm32f4 中使用外部 adc 输出连续读取 16 位并行数据时遇到问题 我在用着 GPIOA->IDR 16位数据如何存储在IDR中 以及如何访问输入数据寄存器

回答 1 投票 0

CS32F103C8T6 蓝色药丸克隆 - 无法从 AC6 SystemWorkbench 进行刷新

我正在尝试使用 AC6 SystemWorkBench 和 ST-LINK v2 设备来刷新带有 CS32F103C8T6 芯片的蓝色药丸克隆。这是一个由 STM32CubeMX 构建的项目 - 我使用的是 MacOS Mojave 机器。他...

回答 4 投票 0

STM32 HAL_CRC 16 位

我尝试在我的STM32L4上使用HAL_CRC来计算16位CRC,但不知何故,无论输入是什么,我总是得到相同的结果...... CRC 初始化 hcrc.Instance = CRC; hcrc.Init.CRCLen...

回答 2 投票 0

执行MI命令失败:目标远程本地主机:61234

我尝试在STM32L552ZET6Q MCU上运行程序。我使用STM32CubeIDE来编写程序,ST-LINK(ST-LINK GDB服务器)作为调试探针和SWD接口。 我成功编译了程序,但是同时

回答 4 投票 0

STM32 HAL_UART_Transmit_IT()有助于节省CPU时间吗?

HAL_UART_Receive_IT() 有助于节省 CPU 时间。 HAL_UART_Transmit_IT()怎么样? HAL_UART_Transmit_IT() 是否有助于节省 CPU 时间? 阻塞模式下的 UART 传输和 Interr... 之间有什么区别

回答 1 投票 0

UVC MJPEG 流 - 是否可以从 USB UVC 流中提取 jpeg 图像?

我正在使用某人编写的 STM32 微控制器代码库来从 HDMI 到 USB 接口读取 UVC 数据。我能够收集图像数据并将其设置为 MJPEG 格式,但无法获取

回答 2 投票 0

C 程序初始化闪存并检测其已初始化

我想将外部闪存中的一些值保存到微控制器中。每次运行程序时,这些值通常都会增加。我想将它们初始化为0。 之前...

回答 1 投票 0

RTC闹钟中断while循环

我的问题是,当激活rtc闹钟时,它每10秒打印一次中断中的消息,但它停止打印主程序的while循环中的消息。 我是...

回答 1 投票 0

如何在STM32 IDE的OLED显示屏上显示“°C”?

我无法在显示器中显示摄氏度符号,除了手动画圆之外还有什么办法吗? 我尝试将某些符号的“char ASCII 代码”提供给...

回答 1 投票 0

STM32F746 - SD 卡 CRC 在 4 位模式下失败,但在 1 位模式下工作正常

最近买了一块STM32F746的Nucleo-144开发板。对于我正在从事的项目,我需要获得一致的 >3 MB/s 的 SD 卡写入速度。使用STM32CubeIDE,我已经...

回答 2 投票 0

是否可以在 STM32F3 上使用 DMA 通过 SPI 传输无限数据?

我正在开发一种基于新协议的 RF 调制解调器,该调制解调器具有在一帧中传输 96 字节的功能 - 但它们会在通信结束之前不断发送。我计划使用两个 96 字节缓冲区...

回答 1 投票 0

STM32 板上的多个项目(或图像)

我来这里是想问一些有关我的项目的问题。 现在我正在实现一个精简版虚拟机管理程序。 所以我做了三个独立的项目(monitor.bin,OS1.bin,OS2.bin),并划分了内存。 记忆 { CCMRAM (...

回答 1 投票 0

STM32 Cube IDE - 在最初成功启动和使用后,现在在启动屏幕启动阶段保持空闲状态(Linux)

我使用的是Ubuntu 22.04以及STM32 Cube IDE(最新版本)的官方Debian安装程序,直接从STM网站下载。 安装完所有内容后(默认安装,位于...

回答 2 投票 0

让STM32 Nucleo F030R8与RX和TX引脚进行通信

我在尝试使用在线 mbed 编译器让 Nucleo 发送命令或接收命令时遇到问题。 作为起始步骤,我尝试连接 Nucleo 上的 rx 和 tx 引脚以尝试...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.