OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4500|回复: 3

F1系列开发LIN通信问题?进不了中断

[复制链接]

27

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-11-13
在线时间
50 小时
发表于 2021-2-26 10:32:34 | 显示全部楼层 |阅读模式
1金钱
目前无法触发中断,应该是LIN初始化代码有问题,希望大佬们帮忙看下代码哪里有错误???谢谢
  1. void LIN1_Init(u8 mode, u32 baudRate)
  2. {
  3.         u16 Temporary_Var_16;
  4. u32 Temporary_Var_32;
  5.         memset(&linSlaveDataStr,0,sizeof(_linSlaveDataStr));      // 清空配置
  6.         TIM2_Init();
  7.         GPIO_InitTypeDef  GPIO_InitStruct;                                                                                          // GPIO结构体       
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  10.         AFIO->MAPR &= 0xF8FFFFFF;
  11.         AFIO->MAPR |= 0x02000000;                                                                                      // 禁止SWD复用功能,关闭JTAG-DP,启用SW-DP,用于PB3 PA15
  12.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;                                           // PIN3
  13.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;                 // 推挽输出
  14.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;                // IO口速度为50MHz
  15.         GPIO_Init(GPIOB, &GPIO_InitStruct);                     
  16.         GPIOB->ODR &= 0xFFFFFFF7;  // PB3=0       
  17.         // PA15,推挽输出,50MHz,设为低电平
  18.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;                                                
  19.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;                      
  20.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;                     
  21.         GPIO_Init(GPIOA, &GPIO_InitStruct);               
  22.         GPIOB->ODR &= 0xFFFF7FFF;  // PA15=0                         
  23.         // PA9,复用推挽输出,50MHz,TX
  24.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;                                                
  25.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;                                
  26.         GPIO_Init(GPIOA, &GPIO_InitStruct);                                 
  27.         // PA10,上拉输入,设为高电平,RX
  28.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;                                               
  29.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;                         
  30.         GPIO_Init(GPIOA, &GPIO_InitStruct);       
  31.         GPIOA->ODR |= 0x00000400;                            // PA10=1                                                                                         
  32.         USART_DeInit(USART1);                                                  // USART1复位
  33.         // LIN模式下必须保持的
  34.         USART1->CR1 &= 0xFFFFEFFF;        // CR1[12]至0,1个起始位+8个数据位
  35.   USART1->CR2 &= 0xFFFFC7FF;
  36.         USART1->BRR = BaudrateCalculate( 72000000,baudRate);       
  37.         USART_LINCmd(USART1, ENABLE);                  // 使能LIN模式
  38.         USART1->CR2 |= 0x0040;                                                 // LIN断开符检测中断使能
  39.         USART_LINBreakDetectLengthConfig(USART1, USART_LINBreakDetectLength_11b);  // 11位检测能力
  40.         // 其他 USART 1 配置
  41.         USART1->CR1 |= 0x202C;                                // 使能USART1 发送,接收,接收中断,并使能串口                     
  42.         NVIC_EnableIRQ( USART1_IRQn );               
  43.         // 模式使能,mode=0取前,使能1K电阻;mode=1取后,关闭1K电阻
  44.         while(TIM2_Delay(2,0)){}; TIM2_Delay(0,1);    // 延时2ms,如果测试有问题,那就换成精确时钟函数!
  45.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;                                                
  46.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;                                
  47.         GPIO_Init(GPIOA, &GPIO_InitStruct);               
  48.         // 波特率<=10000取前,PA9=0低速模式,否则取后,PA9=1,高速模式
  49.         if(baudRate <= 10000) {GPIOA->ODR &= 0xFFFFFDFF;}   // PA9=0
  50.         else GPIOA->ODR |= 0x00000200;   //PA9=1
  51.         while(TIM2_Delay( 2,0)){}; TIM2_Delay(0,1);
  52.         GPIOB->ODR |= 0x00000008;   // PA3=1
  53.         while(TIM2_Delay( 2,0)){}; TIM2_Delay(0,1);
  54.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;                                                
  55.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;                                
  56.         GPIO_Init(GPIOA, &GPIO_InitStruct);       
  57.         GPIOA->ODR |= 0x00000200;   //PA9=1
  58. }
复制代码




最佳答案

查看完整内容[请看2#楼]

已解决,前面要加 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ENABLE); 不然 AFIO->MAPR &= 0xF8FFFFFF; AFIO->MAPR |= 0x02000000; 设置无效果
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-11-13
在线时间
50 小时
 楼主| 发表于 2021-2-26 10:32:35 | 显示全部楼层
已解决,前面要加
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ENABLE);
不然
AFIO->MAPR &= 0xF8FFFFFF;
AFIO->MAPR |= 0x02000000;
设置无效果
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2021-2-27 01:12:13 | 显示全部楼层
帮顶
回复

使用道具 举报

27

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-11-13
在线时间
50 小时
 楼主| 发表于 2021-2-27 14:46:14 | 显示全部楼层
已解决,前面要加
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ENABLE);
不然
AFIO->MAPR &= 0xF8FFFFFF;
AFIO->MAPR |= 0x02000000;
设置无效果
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 19:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表