初级会员

- 积分
- 194
- 金钱
- 194
- 注册时间
- 2016-12-14
- 在线时间
- 37 小时
|
5金钱
F429VG 使用HAL库 串口2使用DMA方式通过485芯片通信只能收或者只能发用USB转TTL可以正常收发,找不到合适的地方来拉高或拉低485芯片的控制脚
串口2驱动函数
- void usart2_init(u32 bound)
- {
- //UART 初始化设置
- UART2_Handler.Instance=USART2; //USART1
- UART2_Handler.Init.BaudRate=bound; //波特率
- UART2_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式
- UART2_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位
- UART2_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位
- UART2_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控
- UART2_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式
- HAL_UART_Init(&UART2_Handler); //HAL_UART_Init()会使能UART1
- /*不使用中断处理回调函数*/
- // HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,
- //并且设置接收缓冲以及接收缓冲接收最大数据量
- /*使用DMA不使能串口中断*/
- // __HAL_UART_ENABLE_IT(&UART2_Handler,UART_IT_RXNE); //使能串口2接收中断
- __HAL_UART_ENABLE_IT(&UART2_Handler,UART_IT_IDLE); //使能串口2空闲中断
- HAL_UART_Receive_DMA(&UART2_Handler,usart2_rxbuf,USART2_REC_LEN);//防止接收到的第一帧数据为空,并且长度为默认长度
-
- usart2_en_init(); //使能脚初始化
- }
复制代码
串口2MSPinit
- if(huart->Instance==USART2)
- {
- /* Peripheral clock enable */
- __HAL_RCC_GPIOD_CLK_ENABLE(); //使能GPIOD时钟
- __HAL_RCC_USART2_CLK_ENABLE(); //使能USART2时钟
- /**USART2 GPIO Configuration
- PD5 ------> USART2_TX
- PD6 ------> USART2_RX
- */
- GPIO_Initure.Pin=GPIO_PIN_5; //PD5
- GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
- GPIO_Initure.Pull=GPIO_PULLUP; //上拉
- GPIO_Initure.Speed=GPIO_SPEED_FAST; //高速
- GPIO_Initure.Alternate=GPIO_AF7_USART2; //复用为USART1
- HAL_GPIO_Init(GPIOD,&GPIO_Initure); //初始化PD5
-
- GPIO_Initure.Pin=GPIO_PIN_6; //PD6
- HAL_GPIO_Init(GPIOD,&GPIO_Initure); //初始化PD6
-
- /* USART2 DMA Init */
- /* DMA controller clock enable */
- __HAL_RCC_DMA1_CLK_ENABLE();
- /* USART2_TX Init */
- USART2TxDMA_Handler.Instance = DMA1_Stream6; //数据流选择
- USART2TxDMA_Handler.Init.Channel = DMA_CHANNEL_4; //通道选择
- USART2TxDMA_Handler.Init.Direction = DMA_MEMORY_TO_PERIPH; //存储器到外设
- USART2TxDMA_Handler.Init.PeriphInc = DMA_PINC_DISABLE; //外设非增量模式
- USART2TxDMA_Handler.Init.MemInc = DMA_MINC_ENABLE; //存储器增量模式
- USART2TxDMA_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; //外设数据长度:8位
- USART2TxDMA_Handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; //存储器数据长度:8位
- USART2TxDMA_Handler.Init.Mode = DMA_NORMAL; //外设普通模式
- USART2TxDMA_Handler.Init.Priority = DMA_PRIORITY_MEDIUM; //中等优先级
- USART2TxDMA_Handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
- USART2TxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
- USART2TxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE; //存储器突发单次传输
- USART2TxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE; //外设突发单次传输
-
- HAL_DMA_Init(&USART2TxDMA_Handler);
-
- __HAL_LINKDMA(huart,hdmatx,USART2TxDMA_Handler);
-
- /* USART2_RX Init */
- USART2RxDMA_Handler.Instance = DMA1_Stream5;
- USART2RxDMA_Handler.Init.Channel = DMA_CHANNEL_4;
- USART2RxDMA_Handler.Init.Direction = DMA_PERIPH_TO_MEMORY;
- USART2RxDMA_Handler.Init.PeriphInc = DMA_PINC_DISABLE;
- USART2RxDMA_Handler.Init.MemInc = DMA_MINC_ENABLE;
- USART2RxDMA_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
- USART2RxDMA_Handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
- USART2RxDMA_Handler.Init.Mode = DMA_NORMAL;
- USART2RxDMA_Handler.Init.Priority = DMA_PRIORITY_MEDIUM;
- USART2RxDMA_Handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
- HAL_DMA_Init(&USART2RxDMA_Handler);
- __HAL_LINKDMA(huart,hdmarx,USART2RxDMA_Handler);
-
- HAL_NVIC_EnableIRQ(USART2_IRQn); //使能USART2中断通道
- HAL_NVIC_SetPriority(USART2_IRQn,0,2); //抢占优先级0,子优先级2
- /* DMA interrupt init */
- /* DMA1_Stream5_IRQn interrupt configuration */
- HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 1, 2);
- HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
- /* DMA1_Stream6_IRQn interrupt configuration */
- HAL_NVIC_SetPriority(DMA1_Stream6_IRQn, 1, 3);
- HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn);
- }
复制代码 接收中断内的数据处理函数
- void UsartReceive_IDLE(void)
- {
- u32 temp;
- if(__HAL_UART_GET_FLAG(&UART2_Handler,UART_FLAG_IDLE) != RESET) //空闲中断
- {
- usart2_rev_flag = 1; //标志位置1
- __HAL_UART_CLEAR_IDLEFLAG(&UART2_Handler); //清空闲中断标志位
- HAL_UART_DMAStop(&UART2_Handler); //停止DMA
- temp = __HAL_DMA_GET_COUNTER(&USART2RxDMA_Handler);// 获取DMA中未传输的数据个数
- usart2_con = USART2_REC_LEN - temp; //获取长度
- HAL_UART_Receive_DMA(&UART2_Handler,usart2_rxbuf,USART2_REC_LEN);//接收数据
- }
- }
复制代码
3个中断函数
- /*串口2中断处理函数*/
- void USART2_IRQHandler(void)
- {
-
- #if SYSTEM_SUPPORT_OS //使用OS
- OSIntEnter();
- #endif
- UsartReceive_IDLE();
- HAL_UART_IRQHandler(&UART2_Handler);
-
- #if SYSTEM_SUPPORT_OS //使用OS
- OSIntExit();
- #endif
- }
复制代码- void DMA1_Stream6_IRQHandler(void)
- {
- if(__HAL_DMA_GET_FLAG(&USART2TxDMA_Handler,DMA_IT_TC) != RESET )
- {
- USART2_EN = 0; //改为接收模式
- }
-
- HAL_DMA_IRQHandler(&USART2TxDMA_Handler);
- // USART2_EN = 0; //改为接收模式
- }
- void DMA1_Stream5_IRQHandler(void)
- {
-
- HAL_DMA_IRQHandler(&USART2TxDMA_Handler); //调试时该中断从未进入过
- }
复制代码 串口发送函数
- /*串口2发送函数*/
- void usart2_send(u8 *ch,u16 len)
- {
- OS_CPU_SR cpu_sr;
- OS_ENTER_CRITICAL(); //关中断
-
- HAL_UART_Transmit_DMA(&UART2_Handler,ch,len); //串口DMA发送函数
- USART2_EN = 1; //发送模式
- OS_EXIT_CRITICAL(); //开中断
- }
复制代码 麻烦有经验的看一下问题在哪里
|
|