标签: microcontroller

用于不同大小阵列的 UART DMA

将 MPLAB X 1.70 与 dsPIC33FJ128GP802 微控制器一起使用。

我有一个应用程序,它以不同的采样率(一个为 50Hz,另一个为 1000Hz)从两个传感器收集数据,两个传感器数据包的大小也不同(一个是 5 字节,另一个是 21 字节)。到目前为止,我一直使用手动 UART 传输,如下所示:

void UART_send(char *txbuf, char size) {
    // Loop variable.
    char i;

    // Loop through the size of the buffer until all data is sent. The while
    // loop inside checks for the buffer to be clear.
    for (i = 0; i < size; i++) {
        while (U1STAbits.UTXBF);
        U1TXREG = *txbuf++;
    }
}
Run Code Online (Sandbox Code Playgroud)

不同大小的数组(5 或 21 字节)被发送到这个函数,它们的大小和一个简单的 for 循环遍历每个字节并通过 UART tx 寄存器 U1TXREG 输出它。

现在,我想实现DMA来减轻传输大量数据时对系统的压力。我已将 …

c microcontroller pic dma mplab

5
推荐指数
1
解决办法
3955
查看次数

Tiva 上的 I2C 接口

在 Tiva(Texas Instruments Cortex M4F ARM)TM4C129XNCZAD 上,I2C 接口有问题。我通过端口 K 启用了 I2C 模块 4 上的主设备和通过端口 B 的 I2C 模块 6 上的从设备。我已将两个 I2C 模块互连。使用德州仪器驱动程序库,我尝试使用 I2C_MASTER_CMD_SINGLE_SEND 命令发送 1 个字节。我花了很多时间让它工作,但 SCK 线保持低逻辑电平。我完全遵循了 TivaWare™ Peripheral Driver Library USER'S GUIDE,但通信不起作用。有没有人有一些经验?

有我的代码:

#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_i2c.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/i2c.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "inc/tm4c129xnczad.h"

#define SLAVE_ADDRESS 0x3C

void  delay  (void)
{
    volatile uint32_t ui32Loop; 
    for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++);
}

volatile  uint32_t  result;

int  main  (void)
{ …
Run Code Online (Sandbox Code Playgroud)

c embedded microcontroller arm

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

输出比较和脉宽调制功能之间有什么区别?

我正在使用 STM32 系列复习微控制器。(特别是使用 STM32F072BDISCOVERY 板)。

我在理解计时器的使用及其各种模式时遇到了一些麻烦。具体来说,“输出比较”(OC)模式有很多选项,“PWM”模式有其他选项。RM0091 参考手册的编写好像它们是两种不同的交替操作模式。我也在使用新的 HAL 驱动程序,并且有不同的 API 可以使用 OC 与 PWM。

但是,在我看来,PWM 基本上是输出比较功能的子集/用例,其中定时器通道配置为直接驱动硬件输出。

我缺少的 OC 和 PWM 模式之间是否有明确的区别?PWM 波形生成以何种方式不是输出比较功能?

microcontroller stm32

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

CMSIS 和外围设备驱动程序

CMSIS 文件和外围驱动程序文件中编写了哪些类型的代码。我如何区分它们?任何例子都会更有帮助。谢谢你。

c peripherals microcontroller cmsis

5
推荐指数
1
解决办法
2600
查看次数

i2c 协议 NACK 歧义

我有一个关于 I2C 协议的问题。我在维基百科页面上找到了这个。

“如果发送器看到 1 位 (NACK),它就会了解到:

1) 从机无法接受数据。2) 没有这样的从站 3) 无法理解命令 4) 无法接受更多数据。”

第一点和第四点似乎是相互矛盾的。场景是:我正在尝试在微控制器之间进行通信,因此,一个将充当主控制器,另一个将充当从控制器。我从主控制器传输 10 个字节,而从控制器在我的实现中只能接收 5 个字节。

所以我的问题是根据 i2c 协议从机何时应该发送 NACK?1) 收到第5个字节后。2) 收到第6个字节后。

microcontroller i2c

5
推荐指数
1
解决办法
1432
查看次数

嵌入式世界中的 C 文件函数

我对嵌入式系统和一个库有疑问。

我目前正在使用一种名为 Ambiq [3] 的设备,该设备使用 Cortex M-4,我想在其上使用 FANN(快速人工神经网络)库 [2]。我能够编译和链接所有内容,但问题是 FANN 库在启动时需要读取 2 个文件。

现在,我有一个嵌入式系统,所以我没有任何文件系统,也没有操作系统。我很确定我可以以某种方式将该文件的内容写入闪存,但我真的不知道如何将第一个文件地址链接到 C 文件函数,例如“fopen”需要文件名作为输入。我只需要文件名和文件物理地址之间的某种联系,如果它存在(或者接受与文件名不同的内容的 C 函数),我就完成了。

我已经尝试过的一件事是使用 xxd -i [文件名] [1] 将文件的内容硬编码到 C 数组中,但我不知道应该如何链接 FANN 库使用的 fopen。我还启动了一些 cleaver 解析器,但它似乎非常耗时。

如果您有什么建议,请告诉我。先感谢您。此致。贾斯基拉特

附加信息: - 用于编译的软件:带有 makefile 的 Eclipse。- 编译器:eabi-none-gcc 工具箱 - 我正在使用应在 Cortex M4 上运行的 Ambiq 微控制器应用程序直接编译 FANN 库源代码。

参考资料: [1]在编译时将文件读入字符串 [2] FANN LIBRARY UFFICIAL SITE http://leenissen.dk/fann/wp/ [3] AMBIQ MICRO: http: //ambiqmicro.com/

c embedded microcontroller file

5
推荐指数
1
解决办法
1870
查看次数

STM32 SPI 硬件和严格别名警告

我已经看到这个主题已经在许多其他问题中讨论过,但我无法找到适合我的具体情况的答案。

我正在使用 STM32F0 微控制器。SPI 接收/发送 FIFO 的顶部可通过存储器访问进行访问。这个特殊的微控制器允许我从 FIFO 顶部读取/写入 8 位或 16 位。更准确地说,当执行 LDRB/STRB 指令时,将 8 位从 FIFO 弹出/推送到 FIFO,而当执行 LDRH/STRH 指令时,将从 FIFO 弹出/推送 16 位。

STMicroElectronics 提供的硬件抽象层提出了这种语法来读取 SPI FIFO。

return *(volatile uint8_t*)&_handle->Instance->DR; // Pop 1 byte
return *(volatile uint16_t*)&_handle->Instance->DR; // Pop 2 byte

*(volatile uint8_t*)&_handle->Instance->DR = val; // Push 1 byte
*(volatile uint16_t*)&_handle->Instance->DR = val; // Push 2 bytes
Run Code Online (Sandbox Code Playgroud)

SPI FIFO 顶部的DR一个指针在哪里uint32_t*

我已经使用这种语法构建了我的软件,并且它工作得很好。唯一的问题是 g++ 抛出了很多关于类型双关的警告。更确切地说:

Inc/drivers/SPI.h:70:50:警告:取消引用类型双关指针将破坏严格别名规则 [-Wstrict-aliasing] return *(volatile uint16_t*)&_handle->Instance->DR;

经过一些阅读后,看起来在 C++ 中使用 union 并不是一个好主意。无论如何我确实尝试过但遇到了一些问题。实际上,通过联合中的指针访问内存会使我的微控制器崩溃,就像未对齐的内存访问一样。

static_cast …

c++ microcontroller hal stm32 type-punning

5
推荐指数
1
解决办法
1289
查看次数

STM Nucleo I2C 未发送所有数据

编辑:

解决方案是关闭初始化模块中的 I2C 时钟。尽管 STM 可以处理它,但 LCD 的数据表表明它只能处理高达 10kHz 的频率。
对于 DMA,必须在 CubeMX 软件中启用和设置一个 IRQ,以启用 DMA TX/RX 线。


我正在使用带有 freeRTOS 的 STM32 - Nucleo-F401RE 板。我最近使用过 freeRTOS,但我从未真正使用过 I2C。

尝试使用 CubeMX 生成的 I2C 驱动程序设置一个简单的LCD 显示器

到目前为止,它只发送了我请求发送的数据的一半左右。我已经使用简单的“show firmware”命令对其进行了测试,并且可以正常工作。所以我可以验证 I2C 实例是否设置正确。

/* I2C1 init function */
static void MX_I2C1_Init(void)
{

  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 100000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  { …
Run Code Online (Sandbox Code Playgroud)

c microcontroller stm32 i2c freertos

5
推荐指数
1
解决办法
1114
查看次数

致命错误 ST-Link 未找到 MCU 设备

我正在使用 IAR Workbench,但很难刷新我得到的 STM32F407VG:

致命错误 ST-Link 未找到 MCU 设备。

  • 连接笔记本电脑和 MCU 的 USB 电缆是新的,所以我不认为这是问题所在。
  • ST-Link en.stsw-link009 已安装

当我转到项目选项 Debugger > ST-Link > Reset > connect during reset 并尝试再次下载时,我得到:

addr = 0x00000016下载进度条保持阻塞后,警告堆栈指针设置为不正确的对齐堆栈。

通过在选项菜单中导航,我发现可以调整 CPU 频率,实际上它是 72 MHz,默认是 72 MHz,我将其更改为 168 MHz,即 CPU 频率,但问题仍然存在。

您能否建议我一些解决方案来调试/解决问题。

编辑

我已经使用 STM32 ST-Link Utility 并且我成功连接到板子,但是我的 IDE 的问题还没有解决。

embedded microcontroller stm32

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

链接描述文件中的“ENTRY”是什么意思?

我开始学习为微控制器编写一些底层软件,并且我已经开始研究链接器脚本。

我真的不明白 ENTRY 命令在这种情况下的含义。由于大多数微控制器在预定地址开始执行,因此我们在链接描述文件中选择哪个入口点有什么区别?

microcontroller linker elf entry-point

5
推荐指数
1
解决办法
5350
查看次数

标签 统计

microcontroller ×10

c ×5

stm32 ×4

embedded ×3

i2c ×2

arm ×1

c++ ×1

cmsis ×1

dma ×1

elf ×1

entry-point ×1

file ×1

freertos ×1

hal ×1

linker ×1

mplab ×1

peripherals ×1

pic ×1

type-punning ×1