stm32f407使用wk2124拓展四串口

SPI配置

使用SPI2

SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线,用于主控和外挂芯片之间的通信

四根通信线:SCK(Serial Clock 串行时钟线 别称:SCLK CLK CK)、MOSI(Master Output Slave Input 主机输出从机输入 别称:DO Data Output)、MISO(Master Input Slave Output 主机输入从机输出 DI Data Input)、SS(Slave Select 从机选择 别称:NSS Not Slave Select 、 CS Chip Select)

同步,全双工

SCK引脚,用来提供时钟信号,数据位的输出和输入,都是在SCK的上升沿和下降沿进行的,这样,数据位的收发时可就可以明确的确定。
全双工,就是数据发送和数据接收单独各占一条线,发送用发送的线路,接收用接收的线路,两者互不影响。MOSI和MISO,就是分别用于发送和接收的两条线路,MOSI,是主机输出从机输入,如果是主机接在这条线上,那就是MO,主机输出,如果是从机接在这条线上,就是SI,从机输入,意思就是一条通信线,如果主机接在上面配置为输出,那从机肯定得配置为输入,才能接收主机的数据,主机和从机不能同时配置为输出或输入,要不然就没法通信了,所以这条MOSI,就是主机向从机发送数据的线路,同理下面这条MISO,就是主机从从机接收数据的线路。
支持总线挂载多设备(一主多从)

    SPI_InitTypeDef  SPI_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//使能SPI2时钟,在APB1时钟里面
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_15|GPIO_Pin_14;
	//PB13-15分别复用为SCK,MISO,MOSI
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
	//GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_15|GPIO_Pin_14);

 	GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_SPI2); 
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2); 
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_SPI2);


	//RCC_APB2PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE);//复位SPI1
	//RCC_APB2PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);//停止复位SPI1
	
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //SPI设置为双线双向全双工
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;		//设置为主SPI
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;		//SPI发送接收8位帧结构
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;		//时钟悬空低
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;	//数据捕获于第二个时钟沿
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;		//NSS信号由软件(使用SSI位)管理
	//SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;	//定义波特率预分频的值:波特率预分频值为256
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;	//定义波特率预分频的值:波特率预分频值为256
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	//数据传输从MSB位开始
	SPI_InitStructure.SPI_CRCPolynomial = 7;	//CRC值计算的多项式
	SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
 
	SPI_Cmd(SPI2, ENABLE); //使能SPI外设
	SPI2_WK_ReadWriteByte(0xff);//启动传输

SPI2速度设置

设置为10M时钟,高速模式 

assert_param(IS_SPI_BAUDRATE_PRESCALER(SpeedSet));//判断有效性
SPI2->CR1&=0XFFC7;//位3-5清零,用来设置波特率
SPI2->CR1|=SpeedSet;	//设置SPI2速度
SPI_Cmd(SPI2,ENABLE); //使能SPI2

SPI片选初始化,以及wk复位脚初始化

片选PB9,wk2124复位脚PB4 

 GPIO_InitTypeDef  GPIO_InitStructure;
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);		 //使能PB端口时钟
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_4;	//PB12端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出	
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;		 //IO口速度为100MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB12
 GPIO_SetBits(GPIOB,GPIO_Pin_9);						 //PB12 输出高	

中断初始化

使用PB3脚做wk2124中断

 	EXTI_InitTypeDef EXTI_InitStructure;
 	NVIC_InitTypeDef NVIC_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIO时钟

  //GPIOB.3 中断线以及中断初始化配置   下降沿触发
  	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,GPIO_PinSource3);

  	EXTI_InitStructure.EXTI_Line=EXTI_Line3;
  	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
  	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  	EXTI_Init(&EXTI_InitStructure);	 	//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器


    NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;			//使能按键KEY2所在的外部中断通道
  	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;	//抢占优先级2, 
  	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;					//子优先级2
  	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								//使能外部中断通道
  	NVIC_Init(&NVIC_InitStructure);

 wk2124驱动

请参考官方给的文件,在此不再赘述

main函数

void EXTI3_IRQHandler(void)
{ 

  printf("IN EXTI3_IRQ!!!!\n");


	if(EXTI_GetFlagStatus(EXTI_Line3)!= RESET){ 
		EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE1上的中断标志位  
		irq_flag=1;
		printf("IN EXTI3_IRQ over! !!!\n");
	}
}

void delay_us(uint32_t delay_us)
{    
  volatile unsigned int num;
  volatile unsigned int t;
 
  
  for (num = 0; num < delay_us; num++)
  {
    t = 11;
    while (t != 0)
    {
      t--;
    }
  }
}

//毫秒级的延时
void delay_wk_ms(uint16_t delay_ms)
{    
  volatile unsigned int num;
  for (num = 0; num < delay_ms; num++)
  {
    delay_us(1000);
  }
}



int main(void)
{
	
	unsigned char dat1;
	uint8_t dat_test,dat_test1,err1 = 0,err = 0,i = 0;
	uint8_t prot = 1, prot1 = 2,rev_len = 0;
	unsigned char data1[10] = {'a','1','b','c','f','9','h','e','l','l'};
	//unsigned char data1[10] = {1,2,3,3,4,7,7,6,6,9};
	unsigned char rev_data[256] = {0};
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);	//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_printf_init(115200);//printf初始化
	ff_hal_ntc_init();//ADC初始化
	WK_SPI_Init();
	

	 GPIO_SetBits(GPIOB,GPIO_Pin_4);						 
	 delay_wk_ms(50);
	 GPIO_ResetBits(GPIOB,GPIO_Pin_4);					
	 delay_wk_ms(10);
	 GPIO_SetBits(GPIOB,GPIO_Pin_4);						
	 delay_wk_ms(10);
	Wk2124_RstInit();

	 
	/*读写GNEA,测试主接口通信是否成功*/
	dat1=WkReadGReg(WK2XXX_GENA);
	delay_wk_ms(1000);
	printf("gena=0x%x.\n",dat1);

	
	WK2124_all_init(prot);
	WK2124_all_init(prot1);
	dat1=WkReadGReg(WK2XXX_GENA);
	delay_wk_ms(200);
	printf("gena=0x%x.\n",dat1);

	WK2124SetBaud(prot,115200);
	WK2124SetBaud(prot1,115200);

	EXTIX_WK_Init();

    WK2124SendBuf(1,(unsigned char *)"Distance Stop\r\n", strlen("Distance Stop\r\n"));
    rev_len=WK2124ReadReg(1,WK2XXX_RFCNT);
		 
    WK2124ReadFifo(1,rev_data,strlen("Distance Stop\r\n"));
    printf("revicie: %s send :%s ,rev_len:%d\n",rev_data,(unsigned char *)"Distance Stop\r\n" , rev_len);

}

测试

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32F407是一款强大的微控制器,拥有丰富的外设资源,包括6个串口接口。要同时使用6个串口接口,首先需要了解STM32F407串口接口资源分布情况。通常,STM32F407有多个USART、UART和SPI接口,这些接口可以被用于串口通信。 在使用6个串口接口时,需要按照每个串口接口的功能去配置相应的GPIO管脚,并将串口接口初始化为需要的工作模式,比如UART、USART或SPI等。需要确保每个串口接口的时钟和中断设置都是正确的,以确保6个串口接口能够同时正常工作。 使用6个串口接口进行通信时,需要考虑数据传输的速率、传输方式以及数据的处理。为了避免冲突和混淆,可以使用不同的波特率、数据位和停止位来区分每个串口接口的通信。同时,也需要考虑数据的缓冲和处理,确保在同时使用6个串口接口时,能够准确高效地处理数据。 另外,需要确保6个串口接口的中断优先级设置正确,以及中断服务函数的编写和处理。这样才能确保当有数据到达时,能够正确地触发相应的中断服务函数,并及时地处理数据。 总之,要在STM32F407上同时使用6个串口接口,需要细致地规划和配置每个串口接口,确保它们能够同时正常工作,并且能够高效地处理数据。同时也需要小心处理中断和数据处理的问题,以确保6个串口接口的同时使用不会出现冲突和问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SU QI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值