小编Lun*_*din的帖子

stm32 SPI + DMA

我尝试使用DMA通道使用SPI发送数据.当我在没有DMA的情况下发送一切都没问题,但是用DMA确实是错误的.当我调试我的程序时,SPI DR寄存器始终为0.我想使用dma循环模式一直发送我的数组.有我的代码GPIO INIT:

GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(SPI_PERIPH_CLOCK, ENABLE);
RCC_AHBPeriphClockCmd(GPIO_PERIPH_CLOCK, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

GPIO_PinAFConfig(GPIOB, AF_PIN_SOURCE, GPIO_AF);

GPIO_InitStructure.GPIO_Pin = GPIO_PIN_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);
Run Code Online (Sandbox Code Playgroud)

SPI INIT

SPI_I2S_DeInit(SPI1);

SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);

SPI_Cmd(SPI1, ENABLE);
Run Code Online (Sandbox Code Playgroud)

DMA INIT:

    DMA_InitTypeDef dma;
    DMA_DeInit(DMA1_Channel1);
    DMA_StructInit(&dma);

    dma.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR;
    dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    dma.DMA_PeripheralDataSize …
Run Code Online (Sandbox Code Playgroud)

c embedded spi stm32 dma

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

为什么常量语法中没有符号字符?

为什么标准在常量语法中不包含符号字符?

值得一提的是,只有数字和符号字符才会出现在指数中.

c syntax

4
推荐指数
2
解决办法
75
查看次数

为什么需要“ -lpthread”?

所以我的问题是:为什么在编译命令末尾需要“ -lpthread”?

为什么此命令起作用:

gcc -o name name.c -lpthread
Run Code Online (Sandbox Code Playgroud)

但这不会:

gcc -o name name.c
Run Code Online (Sandbox Code Playgroud)

我在我的C代码中使用了pthread.h库。
我已经在网上寻找一些答案,但并没有真正找到可以理解的答案

c gcc compilation pthreads

4
推荐指数
2
解决办法
76
查看次数

如何检查 int32_t 数是否适合 int8_t 和 int16_t?

我有一个 int32_t 号,我需要检查它是否适合 int8 和 in16,但是当我尝试时:

    if (number ==(int32_t)((int8_t) number)) {
    printf("%s %d\n","8", number);
    
} else if (number ==(int32_t)((int16_t) number)){
    printf("%s %d\n","16", number);
    
Run Code Online (Sandbox Code Playgroud)

编译器说第一个 if 语句总是正确的,但我不知道如何以其他方式做到这一点,只使用“==”和诸如 << >> 之类的位操作。和 <stdint.h>。

c c++ clang

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

Web窗体内联代码开始标记

我只是想知道为什么存在这些不同的开始标签,如果还有更多,并且它们是否可以互换使用:

<%# Do.Something() %>
<%= Do.Something() %>
...
Run Code Online (Sandbox Code Playgroud)

.net asp.net

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

C中的位设置/清除?

我怎么写一个位?我有一个1或0的变量,我想将其值写入8位reg变量中的单个位.

我知道这会设置一下:

reg |= mask; // mask is (1 << pin)
Run Code Online (Sandbox Code Playgroud)

这将清楚一点:

reg &= ~mask; // mask is (1 << pin)
Run Code Online (Sandbox Code Playgroud)

有没有办法让我在一行代码中执行此操作,而无需确定值是高还是低作为输入?

c embedded

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

什么是默认整数值?

我读的地方,发生违约浮点值一样1.2double没有float.
那么什么是默认的整数值,比如6,是short , int 还是 long

c int short long-integer

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

如果一个线程锁定了一个互斥锁而没有将其解锁,那么其他线程是否应该被阻塞?

以下代码的输出为4000;如果具有互斥锁的线程不释放它,为什么是4000。我虽然会陷入僵局,但主要是我等待所有功能完成。

int M = 1000;
HANDLE mutex;
DWORD WINAPI thread_function(LPVOID param) // The thread function
{
    long aux;
    WaitForSingleObject(mutex, INFINITE);
    for (int i = 0; i < M; i++)
    {
        aux = count;         //count is global
        aux++;
        Sleep(0.5);
        count = aux;
    }
    /*ReleaseMutex(mutex);*/
    return (DWORD)0;
}
int main()
{
    int N = 4;
    InitializeCriticalSection(&gSection);
    HANDLE* iThread = (HANDLE*)malloc(N * sizeof(HANDLE));
    mutex = CreateMutex(NULL, FALSE, NULL);
    for (int i = 0; i < N; i++)    // N = 4, i create …
Run Code Online (Sandbox Code Playgroud)

c winapi multithreading mutex

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

我应该在类似函数的宏中做哪些更改以使其符合 MISRA?

类似函数的宏是

#define ARRAYSIZE(_Array)  ((sizeof(_Array)) / (sizeof(_Array[0])))
Run Code Online (Sandbox Code Playgroud)

显示的错误是:

错误[P​​m154]:在类函数宏的定义中,参数的每个实例都应括在括号中(MISRA C 2004 规则 19.10)

c misra c-preprocessor

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

分号真的是 C 中的一个序列点吗?

根据this answer,以下是标准中描述的序列点:

  1. 在函数调用和实际调用中的函数指示符和实际参数的评估之间;

  2. 在运算符 &&、|| 和 , 的第一个和第二个操作数的计算之间;

  3. 在条件 ?: 运算符的第一个操作数的评估与第二个和第三个操作数中的任何一个评估之间;

  4. 完整声明符的结束;

  5. 在完整表达式的求值和要求值的下一个完整表达式之间。以下是完整的表达:

    • 一个初始化程序;
    • 表达式语句中的表达式;
    • 选择语句的控制表达式(if 或 switch);
    • while 或 do 语句的控制表达式;
    • for 语句的每个表达式;
    • return 语句中的表达式。
  6. 在库函数返回之前;

  7. 在与每个格式化输入/输出函数转换说明符相关联的动作之后;

  8. 在每次调用比较函数之前和之后,以及在对比较函数的任何调用和作为参数传递给该调用的对象的任何移动之间。

该标准从未明确提到分号是一个序列点,但是已经说明的各种序列点暗示分号确实是一个序列点。

那么,分号是在break;还是continue;序列点中?

c continue break sequence-points language-lawyer

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