我试图理解(并随后实现)干净飞行四轴飞行器固件用于 srxl 包验证的 crc16 验证。
SRXL 是一种简单的串行协议,用于通过单条串行线传输伺服值。
包结构是这样的:
crc16 通过以下函数验证:
//srxlFrameLength is the package length
//srxlFrame is the received package buffer
uint16_t crc_calc = 0;
for (i = 0; i < srxlFrameLength; i++) {
crc_calc = crc16_CCITT(crc_calc, srxlFrame[i]);
}
if(crcCalc == 0){ //package is valid }
Run Code Online (Sandbox Code Playgroud)
我不明白这是如何运作的。如果我要实现这个,我会迭代计算包的所有字节的 crc,直到达到保存的 crc,然后与保存的 crc 进行比较。为什么这个实现也有效?
我还想为发送方实现一个包生成器代码。是否可以像这样实现 crc 生成:
uint16_t crc_calc = 0;
for(int i = 0; i < packetLength; ++i){
crc_calc = crc16_CCITT(crc_calc, packet[i]);
}
//concat calculated crc16 to packet here.
Run Code Online (Sandbox Code Playgroud)
提前致谢,
马尔特
我有一个简单的项目,使用 CubeMX 创建用于外围设备初始化。
SPI 处于从机模式,并且似乎已正确初始化,但是当我对 8 位数据进行计时时,不会调用中断。
这是代码
/* SPI1 init function */
static void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_SLAVE;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(hspi->Instance==SPI1)
{
/* USER CODE BEGIN SPI1_MspInit 0 */
/* …Run Code Online (Sandbox Code Playgroud) 在我的项目中,我使用Winbond W25Q64 64-MB 串行闪存,当我阅读该串行闪存的数据表时,有两种类型:
SPI(W25Q64 闪存 ID:- 0xEF4017)和 QPI(W25Q64FV 闪存 ID:- 0xEF6017)。
我很了解SPI,但是我第一次听说QPI。所以我有一些问题-
1.SPI和QPI有什么区别?
2.我可以使用QPI通信类型的Flash(使用SPI)吗?
3.QPI的主要特点是什么?QPI(通信协议还是其他协议)是什么?
我使用WinBond W25Q64JV SPI Flash芯片来存储数据,微控制器是STM32F101RCT6。当我尝试将数据存储在华邦芯片中时,它工作正常,我可以在华邦芯片中读取和写入数据,但如果我想覆盖同一地址中的新数据,它不会被覆盖,并且会提供旧数据新数据未写入同一内存中。如果我使用擦除选项,则会擦除所有地址位置中的所有数据,我无法擦除特定地址数据。删除所有地址数据后,我可以写入新数据,但我正在丢失所有其他位置的数据,因此请指导我覆盖同一地址位置中的新数据/特定地址的擦除选项,我的代码如下
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
Spi_data[0]=0x06; //Write Enable
HAL_SPI_Transmit(&hspi2,Spi_data,1,1000);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
Spi_data[0]=0x02; //Page Program
Spi_data[1]=0x00;
Spi_data[2]=0x10;
Spi_data[3]=0x14;
Spi_data[4]=0x43;
HAL_SPI_Transmit(&hspi2,Spi_data,5,10000);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
Spi_data[0]=0x03;//Read Data
Spi_data[1]=0x00;
Spi_data[2]=0x10;
Spi_data[3]=0x14;
HAL_SPI_Transmit(&hspi2,Spi_data,4,100);
HAL_SPI_Receive(&hspi2,GSdata,4,100);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
Run Code Online (Sandbox Code Playgroud)
当我尝试覆盖 0x1014 位置中的新数据时,如果我使用以下擦除选项,它不会被覆盖,它会擦除所有内存地址数据
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
Spi_data[0]=0x20;//Erase
Spi_data[1]=0x00;
Spi_data[2]=0x10;
Spi_data[3]=0x14;
HAL_SPI_Transmit(&hspi2,Spi_data,4,1000);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
Run Code Online (Sandbox Code Playgroud)
请指导我覆盖同一地址中的新数据/特定地址的擦除选项
我有 STM32F4 DISC-1 的 UART 代码,我希望它也能在其他微控制器上工作。如何开始?
我正在使用 PIC 微控制器进行串行通信项目。我使用CCS C For PIC作为编程软件。该代码现在运行良好,但我想提高我的编程技能(我是初学者)。尤其是这些if言论让我感到困扰。因为它们的数量太多了。我该如何改进这个?
#define bt1 pin_a0
#define bt2 pin_a1
#define bt3 pin_a2
#define bt4 pin_a3
#define bt5 pin_a4
#define bt6 pin_c0
#define bt7 pin_c1
#define bt8 pin_c2
#define bt9 pin_c3
#define bt10 pin_c4
#define bt11 pin_d0
#define bt12 pin_d1
#define bt13 pin_d2
#define bt14 pin_d3
#define bt15 pin_d4
#define enable pin_c5
#define tx pin_c6
#define rx pin_c7
#int_rda
void rda_isr(void)
{
disable_interrupts(int_rda);
output_high(pin_d7);
}
void main()
{
set_tris_a(0xFF);
set_tris_b(0x00);
set_tris_c(0xFF);
set_tris_d(0xFF);
set_tris_e(0x00);
output_high(tx); …Run Code Online (Sandbox Code Playgroud) 我有一个机器人项目,它需要处理来自相机的图像.但我正在寻找一种可以独立进行图像处理的微控制器,不需要任何计算机或笔记本电脑.这样的微控制器是否存在?它是什么?它是如何完成的?
我不太确定我是否应该在这里提出这个问题.我想做一个艺术项目.我想使用语音作为输入,将图像作为输出.图像随声音而变化.
我怎么能意识到这一点?因为我需要实时或50毫秒以下的延迟.起初我认为使用微控制器会更好.但我想计算巨大的图像,也许我的微控制器无法做到这一点.例如,我想计算10.000个移动物体.我可以用windows/linux/mircocontroller实现这个吗?
如果我可以使用Python,那将是非常好的.或者你处理的东西是更好的选择吗?
你需要更多细节吗?
我正在做一个电子项目.在项目中我有一个微控制器.我想衡量一下我的变化对时间表现的影响.
二进制文件不是很大(实际上是11760字节).微控制器运行大约20Mhz(基于晶体值).所以基本上他每秒可以运行20M操作.
您是否认为根据每个功能的指令计数检查由于更改而导致的性能影响是否是个好主意?就像是 :

我正在某个项目中处理uc ATxmega128A1,但是作为ucontroller的初学者,我想知道关于ucs的此通道事件系统是什么。我引用了一个链接http://www.atmel.com/Images/doc8071.pdf,但没有得到它。
microcontroller ×10
c ×5
spi ×3
embedded ×2
stm32 ×2
arduino ×1
audio ×1
avr ×1
crc ×1
eeprom ×1
events ×1
flash-memory ×1
interrupt ×1
microchip ×1
performance ×1
pic ×1
processing ×1
python ×1
real-time ×1
serial-port ×1
stm32f4 ×1