标签: stm32f4discovery

两次处理(通过上升/下降沿)按钮中断

我已经编写了一些代码,每次点击按钮时必须逐个打开LED(在一个圆形中),但有时只需点击一下按钮就可以点亮下一个指示灯而不是一个随机点亮四个指示灯.这就像一个或多个LED跳过它.我认为这个问题是由于时钟速率设置错误或上升/下降EXTI跳闸错误设置造成的.董事会:STM32DISCOVERY

periph.h

#ifndef PERIPH_H
#define PERIPH_H

#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "misc.h"
#include "stm32f4xx_exti.h"
#include "stm32f4xx_syscfg.h"

void Initialize_GPIO_LEDS(void);
void Initialize_GPIO_Button(void);
void Initialize_EXTI0_PA(void);
void Initialize_NVIC(void);

typedef enum
{ 
  GPIO_LED_Green         = GPIO_Pin_12,
  GPIO_LED_Yellow        = GPIO_Pin_13,
  GPIO_LED_Red           = GPIO_Pin_14,
  GPIO_LED_Blue          = GPIO_Pin_15
}GPIO_LED_TypeDef;

void GPIO_LED_On(GPIO_LED_TypeDef GPIO_LED_x);
void GPIO_LED_Off(GPIO_LED_TypeDef GPIO_LED_x);
void GPIO_LED_All_On(void);
void GPIO_LED_All_Off(void);

#endif /* PERIPH_H */
Run Code Online (Sandbox Code Playgroud)

PERIPH.C

#include "periph.h"

GPIO_InitTypeDef GPIO_LEDS;
GPIO_InitTypeDef GPIO_Button;
EXTI_InitTypeDef EXTI0_PA;
NVIC_InitTypeDef NVIC_Struct;

void Initialize_GPIO_LEDS(void)
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

    GPIO_LEDS.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12;
    GPIO_LEDS.GPIO_Mode …
Run Code Online (Sandbox Code Playgroud)

interrupt keil debouncing stm32f4discovery

4
推荐指数
1
解决办法
1171
查看次数

带有HAL库的STM32F4-Discovery(STM32F429ZIT6)上的RS232(UART)?

背景

这是我的一些背景知识,这样你的家伙就可以知道我拥有或者没有相关知识.我完全是这种嵌入式系统的新手.我对电子产品一无所知,我是一个纯粹的软件人.

我唯一的嵌入式系统体验是Raspberry Pi,它与STM32F4 Discovery完全不同.

我可以使用Raspberry Pi上的标准Linux C库实现UART读/写编程,该库连接到带有USB转RS232适配器和电压转换器IC的PC.

我的设备和开发环境

  • 带STM32F429ZIT6 MCU的STM32F429I-DISCO板
  • USB-to-RS232电缆和电压转换器IC,在Raspberry Pi上运行良好.
  • Keil uVision 5 IDE.

我想要实现的目标

我想在STM32F429 Discovery板上实现一个可以向/从PC发送/接收消息的编程.(例如,将字符串发送到PC.当从PC接收到字符串时,点亮板上的LED)

我现在做了什么

现在我已经设置了我的Keil uVision IDE,并且可以编译/运行闪烁LED示例,我也可以编辑该示例以按照我希望的方式控制LED.(例如,按下用户按钮时打开LED,按下按钮时将其关闭)

所以LED部件已经完成了,它是如何使用RS232电缆与STM32F4 Discovery板进行通信的缺失部分.

我的问题

  1. 首先,我想知道我是否正确理解了该板的PIN定义.根据该数据表,我应该将DB9上的TX引脚连接到PD2(UART5_RX),将DB9上的RX引脚连接到PC12(UART5_TX),将DB9上的VCC引脚连接到3.3V,将DB9上的GND连接到GND.这个连接是否正确?

  2. 是否有关于如何在最新版本的Keil uVision上使用新HAL库的UART的示例代码?我在网上搜索过,但是大多数示例代码或教程都使用了一个函数RCC_AHB1PeriphClockCmd,这个函数似乎不存在于来自Keil uVision的新HAL库中.

更新

  1. 我的USB转串口适配器是067b:2303 Prolific Technology, Inc. PL2303 Serial Port一个电平转换器IC.看起来像这样:在此输入图像描述

  2. 当连接到Raspberry Pi时,我遵循了这条指令,因此IC上的VCC/GND连接到Raspberry Pi上的3.3V/GND,我不确定是否需要这样做.

  3. 通过"HAL"库,我的意思是这个stm32f4xx_hal_usart.c文件,根据评论中的许可声明,它似乎来自意法半导体.虽然这个文件中有一些指令,但我仍然很难弄清楚如何使用这个驱动程序.举例来说,我不能告诉之间的区别Enable USARTx interface clockEnable the clock for USART GPIOs,我不知道我怎样才能实现这些功能.因此,如果有一个示例代码,那将是一个很大的帮助,因为我可以将它与这些指令进行比较.

在此输入图像描述 在此输入图像描述

embedded serial-port uart stm32f4discovery

4
推荐指数
1
解决办法
1万
查看次数

使用STM32处理器与SD卡通信 - SDIO协议

我正在使用基于微控制器STM32F401RET6的Nucleo F401Re板.我连接到主板上的Micro SD插槽,并有兴趣将数据写入SD卡并从中读取数据.我使用软件STM32CubeX生成代码,特别是带有内置函数的SD库.我试着编写一个简单的代码,将一个数组写入一个特定的数组,然后尝试读取相同的数据.代码如下:

  int main(void)
{
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_SDIO_SD_Init();

  char buffer[14] = "Hello, world\n";
  uint32_t to_send[512] ; // Te
  uint32_t to_receive[512];
  uint64_t address = 150; 
  HAL_SD_WriteBlocks(&hsd, to_send, address, 512, 1);
  HAL_SD_ReadBlocks(&hsd, to_receive, address, 512, 1);


  while (1)
  {
      HAL_UART_Transmit(&huart2, (uint8_t *)buffer, 14, 1000);
      HAL_UART_Transmit(&huart2, (uint8_t *)to_receive, 512, 1000);

}
Run Code Online (Sandbox Code Playgroud)

代码在函数HAL_Init()的中间停止,我收到以下消息:

The stack pointer …
Run Code Online (Sandbox Code Playgroud)

c stm32 iar stm32f4discovery

4
推荐指数
1
解决办法
1442
查看次数

stm32 DMA无法向SPI1 DR发送数据(不能使用DMA向SPI发送数据)

我正在尝试使用DMA将数据发送到SPI1.然后SPI1将控制DAC以进行电压更新.

使用的芯片是STM32F407.因此,相应的频道/流是:channel3/stream5,如参考手册中所示.但是,当DMA使能时,SPI1-> DR中不显示任何数据,示波器中没有显示结果.

当SPI1-> DR由软件写入时,SPI工作正常.谁能帮忙看看发生了什么?代码如下:

uint16_t DACData[1]; 
void InitDMA(void)
{
    DMA_InitTypeDef DMA_InitStructure;
    DMA_Cmd(DMA2_Stream2, DISABLE);
    while (DMA2_Stream2->CR & DMA_SxCR_EN);
    //SPI1 Tx DMA
    DMA_DeInit(DMA2_Stream5);
    DMA_StructInit(&DMA_InitStructure);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); //Init DMA clock
    DMA_InitStructure.DMA_Channel = DMA_Channel_3;//SPI1 Tx 
    DMA_InitStructure.DMA_PeripheralBaseAddr  = (uint32_t)&(SPI1->DR); //Set the SPI1 Tx
    DMA_InitStructure.DMA_Memory0BaseAddr  = (uint32_t)&DACData;       //Set the memory location
    DMA_InitStructure.DMA_DIR  = DMA_DIR_MemoryToPeripheral;           //
    DMA_InitStructure.DMA_BufferSize  = 1;            //Define the number of bytes to send
    DMA_InitStructure.DMA_PeripheralInc  = DMA_PeripheralInc_Disable;             
    DMA_InitStructure.DMA_MemoryInc  = DMA_MemoryInc_Disable;            
    DMA_InitStructure.DMA_PeripheralDataSize  = DMA_PeripheralDataSize_HalfWord;    
    DMA_InitStructure.DMA_MemoryDataSize  = DMA_PeripheralDataSize_HalfWord;        
    DMA_InitStructure.DMA_Mode  = DMA_Mode_Normal;               //Normal mode (not circular)
    DMA_InitStructure.DMA_Priority …
Run Code Online (Sandbox Code Playgroud)

spi stm32 dma stm32f4discovery

3
推荐指数
1
解决办法
5977
查看次数

PLL 时钟配置

我正在使用 STM32L152RB 板,我正在尝试配置系统时钟以使用 PLL 时钟,但 RCC_FLAG_PLLRDY 标志正在设置,因此程序卡在 while 循环中。请让我做错了什么

EnableHSI();
RCC_PLLConfig(RCC_PLLSource_HSI,RCC_PLLMul_3,RCC_PLLDiv_2);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK);
t=GetSystemClockSource();
Run Code Online (Sandbox Code Playgroud)

stm32 stm32f4discovery stm32ldiscovery stm32l152

3
推荐指数
1
解决办法
5657
查看次数

了解 Cortex M4 上的周期计数

我正在使用带有 Cortex M4 的 STM32F407,并且通过在DWT_CYCCNT调用我在汇编中实现的函数(C 语言)之前和之后直接读取来测量函数的周期计数。我想了解我得到的结果。

08000610 <my_function>:
 8000610:       f04f 20ff       mov.w   r0, #4278255360 ; 0xff00ff00
 8000614:       f04f 11ff       mov.w   r1, #16711935   ; 0xff00ff
 8000618:       ea81 0100       eor.w   r1, r1, r0
 800061c:       ea81 0100       eor.w   r1, r1, r0
 8000620:       ea81 0100       eor.w   r1, r1, r0
 8000624:       ea81 0100       eor.w   r1, r1, r0
 8000628:       4770            bx      lr
 800062a:       bf00            nop
Run Code Online (Sandbox Code Playgroud)

执行上述(包括函数调用)需要21个周期。当我添加一条eor指令时:

08000610 <my_function>:
 8000610:       f04f 20ff       mov.w   r0, #4278255360 ; 0xff00ff00
 8000614:       f04f 11ff       mov.w   r1, #16711935 …
Run Code Online (Sandbox Code Playgroud)

assembly arm stm32f4discovery cortex-m

3
推荐指数
1
解决办法
2072
查看次数

stm32F4 pwm输入捕获的高频信号约.2MHz的?

我想测量PWM信号的频率.为此,我使用STM-F401RE及其Timer_Input_Capture函数.

问题是:

  • 输入信号具有相当高的频率(约2MHz),
  • STM-F401RE控制器只有80MHz时钟

因此,当使用中断程序计算输入信号的上升沿数时,它会错过许多上升沿(取决于输入信号的频率).当使用示波器并切换I/O引脚时,我发现它只能在频率低于400kHz时捕获所有上升沿.

问题是:如何克服这个问题?还是有另一种方法来测量高频输入pwm信号?

谢谢

stm32 stm32f4discovery stm32f4

3
推荐指数
1
解决办法
5339
查看次数

STM32 USB CDC Rx 中断

我已经在STM32-F446re(Nucleo)上实现了USB CDC (VCP)。我正在使用int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)in 循环来接收数据。但是很多数据也被发送过来,因此我想要基于接收中断。

谁能帮我了解如何设置 USB CDC Rx 中断?

embedded stm32 stm32f4discovery stm32f4 nucleo

3
推荐指数
1
解决办法
8584
查看次数

如何在STM32F4探索板的Flash存储器中写入浮点数据

我正在尝试通过 VCP 接收浮点数并将其写入 STM32F4 发现板的闪存中,使用 Keil IDE。用于写入 Flash 存储器的函数:

FLASH_Status FLASH_ProgramDoubleWord(uint32_t Address, uint64_t Data);
FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);
FLASH_Status FLASH_ProgramByte(uint32_t Address, uint8_t Data);
Run Code Online (Sandbox Code Playgroud)

接受一个无符号整数值作为数据输入,但我已经设法使用以下代码在闪存中写入一个有符号整数:

int dataflash1 = -1000;
int gain;
uint32_t Address= 0x08008000;
.......
FLASH_ProgramWord(Address,dataflash1);
.......
gain=*(int*)Address;
Run Code Online (Sandbox Code Playgroud)

不过,我仍然没有设法写入浮点数据。如果我将“int”更改为“float”(它们都应该是 4 个字节的数据,在 keil 编译器指南中说)我会得到类似 1.7345673 e-42 的数字。

也许这是一个愚蠢的问题,但如果你能给我一个线索,我真的很感激。

floating-point flash-memory stm32f4discovery

2
推荐指数
1
解决办法
4935
查看次数

如何将项目从一个 STMFx 系列移植到同一系列中的另一个

总的来说,我对 MCU 的 ST 系列的语言/行话/术语有点困惑,我认为这阻碍了我的进步。

一点背景:我是一名 EE,通过使用 AVR 平台的大学必修课程了解了我对 FW 的所有了解。喜欢它,非常简单且易于使用。快速浏览一下,通过独一无二的数据表,并一鼓作气你抽象掉!宏的、磅定义等...就是这么简单!你编写一个main.c和一个 Makefile,编译并用 avr-dude 启动......生活是美好的。

然后,我走进了STM32 ARM内核的脱粒机,天啊……STDPerifieral Libraries、HAL层、CubeMX、程序集启动文件、CMSIS、IDE特定项目文件,还有十几种不同类型的只是STM32F4.. .我已经快不知所措了!

我真正的问题是我有这个 STM32F411 探索板,我需要运行一个 20x4 字符 LCD。我在 github 等上找到了几个看起来不错的项目:

https://stm32f4-discovery.net/2014/06/library-16-interface-hd44780-lcd-controller-with-stm32f4/

https://github.com/EarToEarOak​​/STM32F4-HD44780

https://github.com/6thimage/hd44780

https://github.com/mirkoggl/STM32F4_LiquidCrystal

但是,我无法弄清楚如何正确编译其中的任何一个。我一直在使用 CubeMx 来生成 Makefile 作为起点,主要是因为它制作了一个链接器脚本和我显然需要的 .s 文件,但我完全没有经验或想法如何自己做到这一点。这就是我对 CubeMX 的依赖。

我认为我的大部分问题是,通过尝试将 CubeMX 生成的 MCU 特定代码和各种在线项目代码粘合在一起,我遇到了很多冲突......在线项目正在调用一些 .h 文件或引用某些东西Makefile 找不到,这就是事情出轨的地方......例如,其中一些项目正在调用该stm32f4xx.h文件,但 CubeMX 并未将其包含在其生成的代码中。

我不得不去系统中的其他地方并将该文件复制到文件./Inc夹中,但这似乎真的倒退了......而且,它仍然没有构建。

如果我要在这里保持头脑清醒,我需要一个 AVR 到 STM32 12 步康复程序或其他东西......

所以,最大的问题是:

你们如何从第一个项目开始git clone xxxx并构建它以在 STM32F411 探索板上运行,arm-none-eabi并且仅使用Makefiles...不允许 IDE。

并且,开发 8 位 AVR 和 …

porting arm makefile stm32 stm32f4discovery

2
推荐指数
1
解决办法
1692
查看次数