关于使用STM32 SPI3的一些总结

总结一下spi3的问题,因为spi3的nss口与JTAG有共用引脚,所以配置错误会导致SPI3无法使用。需要注意以下三点就可以了: 
1.将PA15配置为普通IO口,GPIO_Mode_Out_PP 
2.开启AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 
3.关闭JTAG功能,使能SWD 
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE) ;

其他的SPI口正常配置,因为板子重启后默认为JTAG模式,虽然在调试时使用了SWD,但PA15依然不是普通的IO口,当把它重新配置时,一定要开启AFIO时钟,如果不开启的话,只有GPIO_PinRemapConfig(),会导致程序崩溃,在调试的时候会乱跳,具体原因我也不知道。

以上配置是我调试后的,肯定没问题。注意千万不要使用GPIO_Remap_SWJ_Disable ,因为这样就不能下载程序了,要开锁很麻烦的。


在使用stm32的时候, spi3和jtag口是有重合的, 如果要使用spi3 或者要把jtag口作为普通io口使用可参考如下配置:

1. 使用spi3接口, 参考 卢有亮 老师的教程 [BP19_网络PING实验], 该套代码实现了该项功能

2.  stm32的jtag口可以配置为SWD模式 这样能空余出来三个接口, 并且不影响程序的下载和调试, 关于如何配置为SWD模式可以参考上一篇博客. 

     将STM32的JTAG下载引脚:JTDO、JTDI、JTCK 配置普通IO口其实和配置为spi3 是一样的 只不过spi3还要开spi的时钟, 这里更改为开io口时钟即可, 其中最关键的两条指令是:
      1、打开复用时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,EANBLE);
      2、调用重映射函数:GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag , 开启swd


  • 12
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用STM32的SPI3和DMA控制器进行数据传输的程序: ```c #include "stm32f4xx.h" #define BUFFER_SIZE 100 uint8_t txBuffer[BUFFER_SIZE]; uint8_t rxBuffer[BUFFER_SIZE]; void SPI3_DMA_Init(void) { // 使能SPI3和DMA2时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); // 配置SPI3的GPIO口 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); // 配置SPI3的工作模式 SPI_InitTypeDef SPI_InitStructure; SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI3, &SPI_InitStructure); // 配置DMA2_Stream2 DMA_InitTypeDef DMA_InitStructure; DMA_InitStructure.DMA_Channel = DMA_Channel_0; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI3->DR; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)rxBuffer; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = BUFFER_SIZE; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream2, &DMA_InitStructure); // 使能DMA2_Stream2和SPI3的DMA接收 DMA_Cmd(DMA2_Stream2, ENABLE); SPI_I2S_DMACmd(SPI3, SPI_I2S_DMAReq_Rx, ENABLE); // 使能SPI3 SPI_Cmd(SPI3, ENABLE); } int main(void) { // 初始化SPI3和DMA2 SPI3_DMA_Init(); // 初始化发送缓冲区 for (int i = 0; i < BUFFER_SIZE; i++) { txBuffer[i] = i; } // 发送数据 while (1) { SPI_I2S_DMACmd(SPI3, SPI_I2S_DMAReq_Tx, ENABLE); DMA_Cmd(DMA2_Stream2, DISABLE); DMA_SetCurrDataCounter(DMA2_Stream2, BUFFER_SIZE); DMA_Cmd(DMA2_Stream2, ENABLE); // 等待传输完成 while (DMA_GetFlagStatus(DMA2_Stream2, DMA_FLAG_TCIF2) == RESET) {} // 清除传输完成标志位 DMA_ClearFlag(DMA2_Stream2, DMA_FLAG_TCIF2); } } ``` 在该程序中,首先通过SPI3和DMA2初始化函数进行初始化,然后通过循环向SPI3发送数据,发送数据的过程中,先使能SPI3的DMA发送请求,然后等待传输完成。在传输完成时,需要清除DMA传输完成标志位,以便下一次传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值