标签: microcontroller

6
推荐指数
2
解决办法
2629
查看次数

用于PIC的十六进制分解器

我遇到了PIC Micro控制器的问题.

我很久以前就有一个由我编程的微控制器,我丢失了相关的源代码和原理图.现在我需要反转端口的值.我可以使用一些NOT门来做到这一点,但这样做很麻烦.或者我需要写回整个程序.

我不希望在PIC C或MikroC中看到代码.拥有可理解的汇编代码就足够了.

那么有没有人对我可以用于此目的的好的HEX反编译器有任何经验?根据您的经验发表任何评论?:)

编辑:器件PIC 16F84A

hardware embedded microcontroller decompiling mikroc

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

我应该用什么语言进行自动换档程序?

我正在考虑编写一个自动更换自行车装备的程序.它可能需要一个微处理器,所以我想到的问题是:编程微处理器有什么不同的语言,还是可以用c和c ++来完成?

另一件事是,关于程序,一个switch声明可以做我的工作,还是我需要指针或链表,因为齿轮可以上下两种方式工作?我对switch陈述事情有点困惑!

c microcontroller

6
推荐指数
3
解决办法
2301
查看次数

void*用于维持状态...(C编程)

目前我们正在学习如何编程AVR微控制器(仅限Ansi C89标准).部分包含的驱动程序是一个标题,用于处理调度,即以不同的速率运行任务.我的问题是与文档中的引用有关:

"每个任务必须通过使用静态局部 变量来维护自己的状态."

那是什么意思呢?他们似乎传递void*给维持状态的功能但是不使用它?

看一下我收集的文件中的代码,这就是他们的意思:

{.func = led_flash_task, .period = TASK_RATE / LED_TASK_RATE, .data = 0} 
/* Last term the pointer term */
Run Code Online (Sandbox Code Playgroud)

有一个函数在数组中使用上述参数运行,但它只作为调度程序.然后功能led_flash_task

static void led_flash_task (__unused__ void *data)
{
    static uint8_t state = 0;

    led_set (LED1, state); /*Not reall important what this task is */
    state = !state; /*Turn the LED on or off */
}
Run Code Online (Sandbox Code Playgroud)

并从标题

#define  __unused__ __attribute__ ((unused))
Run Code Online (Sandbox Code Playgroud)

而传递void *data是为了维持任务的状态?这是什么意思?

谢谢您的帮助

c microcontroller avr void

6
推荐指数
1
解决办法
445
查看次数

"6通道DMA"是什么意思?

当我正在研究TMS320F2806x(Piccolo)MCU的架构时,我发现其中的一个功能是6通道DMA.你能否详细说明DMA 的渠道是什么意思?

microcontroller

6
推荐指数
1
解决办法
1451
查看次数

你怎么理解Hex文件?(扩展地址记录)

我正在尝试为PIC18制作一个引导程序,所以我需要了解如何正确处理hex文件.例如,我理解如何处理以下十六行.

:040C0000E2EFFFF030
Run Code Online (Sandbox Code Playgroud)

04:字节数

0C00 :十六进制数字的地址

00:数据记录

E2EFFFF0:数据序列

30:校验和

所以我会知道如何处理上面的行,但是下面的十六行怎么样.

:020000040001F9
Run Code Online (Sandbox Code Playgroud)

02 :字节数

0000: 地址

04:扩展线性地址记录

0001:数据

F9:校验和

但究竟我该怎么做呢?我是否将这些数据写入该地址?你能把它翻译成机器语言吗?

顺便说一下,我的应用程序从地址开始,0c00bootloader从地址开始,在0020它上面是中断向量.谢谢!

更新

如果hex文件的第三行是以下,地址会FFC0改变吗?

:10FFC000FF00FF00FF00FF00FF00FF000001E9EF5E
Run Code Online (Sandbox Code Playgroud)

我在想,因为hex文件的第二行有04(扩展线性地址记录),那么我应该添加0001到第三行的地址FFC0,所以新地址就是这样的.

$0001 + $FFC0将等于1FFC0,所以第3行的下一组数据字节应写入此地址1FFC0,这是正确的吗?

c embedded microcontroller pic bootloader

6
推荐指数
1
解决办法
2121
查看次数

如何使用JAVA控制通过USB/SerialPort等连接PC的LED灯?我应该使用什么设备?

我想在JAVA中编写一个程序,它可以控制LED灯连接到连接到计算机的"东西".

JAVA程序将包含JFrame中的8个切换按钮.按钮编号从1到8,当按下编号为X的按钮时,编号为X的LED将打开; 再次单击(切换)该按钮时,该LED将关闭.

与我们必须在其中加载代码的微控制器不同,我提到的"某些东西"只是接收来自JAVA的信号(可能通过USB/SerialPort/...)来控制灯光.例如,JAVA通过SerialPort将0000_0101(打开LED 1号和3号灯)发送到"某物",然后"东西"将"保留"该值,直到发送新信号.该值的每个数字代表"某物"上引脚的高/低,我将引脚连接到LED.

"Something"可能类似于可以将"串行端口信号"转换为"二进制"并将"二进制"保存在具有输出引脚的寄存器中的设备,我可以将它们连接到LED.

那可能吗?有没有像"东西"这样的设备?它是什么?有没有人有任何建议?还是一些更好的方法来控制PC的灯光?

java microcontroller device serial-communication led

6
推荐指数
2
解决办法
9396
查看次数

使用GCC工具链构建两部分固件映像

我有一些使用GCC构建的固件,它运行在基于ARM Cortex M0的微控制器上.构建当前生成单个二进制映像,可以将其写入微控制器的程序存储器中.

由于与字段更新有关的原因,我需要将此图像分成两个部分,可以单独更新.我将这些称为CoreApp.

  • 核心:包含中断向量表,main()例程以及各种驱动程序和库例程.它将位于程序存储器的前半部分.

  • 应用:包含特定于应用程序的代码.它将位于程序存储器的后半部分.它将在一个已知地址处有一个入口点,由核心调用以启动应用程序.它将通过已知地址访问核心中的功能和数据.

这里有一些明显的限制,我很清楚:

  • 构建应用程序时,需要知道核心中符号的地址.因此必须首先构建核心,并且在链接应用程序时必须可用.

  • 应用程序映像仅与其构建的特定核心映像兼容.

  • 可以在不更新核心的情况下更新应用程序,但反之亦然.

所有这一切都没问题.

我的问题很简单,我如何使用GCC和GNU binutils构建这些图像?

基本上我想像正常的固件映像一样构建核心,然后构建应用程序映像,应用程序将核心视为库.但是,共享链接(这将需要动态链接机制)或静态链接(将复制用于应用程序二进制文件的核心功能)都不适用于此处.我正在尝试做的事情实际上要简单得多:使用已知的固定地址链接现有的二进制文件.我不清楚如何用这些工具做到这一点.

embedded microcontroller linker gcc binutils

6
推荐指数
1
解决办法
1733
查看次数

STM32H743 微控制器 (Cortex-M7) 的此链接描述文件中是否使用了所有 RAM 部分?

我知道最新的 STM32 微控制器中的 RAM 存储器包含几个具有显着速度差异的部分。这就是为什么我试图围绕这些设备的链接描述文件(注意:arm-none-eabi-gcc工具链)。不幸的是,CubeMX 为 STM32F767ZI 生成的链接描述文件只是忽略了 RAM 中的不同部分:

/* Specify the memory areas */
MEMORY
{
  RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 512K
  FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 2048K
}
Run Code Online (Sandbox Code Playgroud)

 
STMicroelectronics 似乎已经做了一些努力,使其最新的STM32H743ZI的链接描述文件更加复杂:

/* Specify the memory areas */
MEMORY
{
  DTCMRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
  RAM_D1 (xrw)      : ORIGIN = 0x24000000, LENGTH = 512K
  RAM_D2 (xrw)      : ORIGIN = 0x30000000, LENGTH = 288K …
Run Code Online (Sandbox Code Playgroud)

microcontroller gcc arm stm32 linker-scripts

6
推荐指数
1
解决办法
3124
查看次数

制作一个"虚拟端口",由Arduino上的多个端口组成

我开始在Arduino上使用端口,而不是手动将每个引脚设置为低电平或高电平.这非常有用且速度更快.我正在进行一个项目,我需要至少一个完整端口(8位)和至少一个串行端口.

我想使用Arduino UNO,但它只有一个完整的端口,端口D. PD0和PD1用于串行通信.这意味着我不能使用端口D.

我想知道是否有可能将多个端口合并为"虚拟端口".最后我想要这样的东西:

PORTX = 0b11111111; // the first 2 bits are PB0/PB1 and bit 3-8 are PD3-PD8
Run Code Online (Sandbox Code Playgroud)

这有可能吗?

port microcontroller arduino arduino-c++

6
推荐指数
1
解决办法
246
查看次数