将 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来减轻传输大量数据时对系统的压力。我已将 …
在 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) 我正在使用 STM32 系列复习微控制器。(特别是使用 STM32F072BDISCOVERY 板)。
我在理解计时器的使用及其各种模式时遇到了一些麻烦。具体来说,“输出比较”(OC)模式有很多选项,“PWM”模式有其他选项。RM0091 参考手册的编写好像它们是两种不同的交替操作模式。我也在使用新的 HAL 驱动程序,并且有不同的 API 可以使用 OC 与 PWM。
但是,在我看来,PWM 基本上是输出比较功能的子集/用例,其中定时器通道配置为直接驱动硬件输出。
我缺少的 OC 和 PWM 模式之间是否有明确的区别?PWM 波形生成以何种方式不是输出比较功能?
CMSIS 文件和外围驱动程序文件中编写了哪些类型的代码。我如何区分它们?任何例子都会更有帮助。谢谢你。
我有一个关于 I2C 协议的问题。我在维基百科页面上找到了这个。
“如果发送器看到 1 位 (NACK),它就会了解到:
1) 从机无法接受数据。2) 没有这样的从站 3) 无法理解命令 4) 无法接受更多数据。”
第一点和第四点似乎是相互矛盾的。场景是:我正在尝试在微控制器之间进行通信,因此,一个将充当主控制器,另一个将充当从控制器。我从主控制器传输 10 个字节,而从控制器在我的实现中只能接收 5 个字节。
所以我的问题是根据 i2c 协议从机何时应该发送 NACK?1) 收到第5个字节后。2) 收到第6个字节后。
我对嵌入式系统和一个库有疑问。
我目前正在使用一种名为 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/
我已经看到这个主题已经在许多其他问题中讨论过,但我无法找到适合我的具体情况的答案。
我正在使用 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 …
解决方案是关闭初始化模块中的 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) 我正在使用 IAR Workbench,但很难刷新我得到的 STM32F407VG:
致命错误 ST-Link 未找到 MCU 设备。
当我转到项目选项 Debugger > ST-Link > Reset > connect during reset 并尝试再次下载时,我得到:
addr = 0x00000016下载进度条保持阻塞后,警告堆栈指针设置为不正确的对齐堆栈。
通过在选项菜单中导航,我发现可以调整 CPU 频率,实际上它是 72 MHz,默认是 72 MHz,我将其更改为 168 MHz,即 CPU 频率,但问题仍然存在。
您能否建议我一些解决方案来调试/解决问题。
编辑
我已经使用 STM32 ST-Link Utility 并且我成功连接到板子,但是我的 IDE 的问题还没有解决。
我开始学习为微控制器编写一些底层软件,并且我已经开始研究链接器脚本。
我真的不明白 ENTRY 命令在这种情况下的含义。由于大多数微控制器在预定地址开始执行,因此我们在链接描述文件中选择哪个入口点有什么区别?
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