中级会员
 
- 积分
- 425
- 金钱
- 425
- 注册时间
- 2019-11-13
- 在线时间
- 50 小时
|
1金钱
目前无法触发中断,应该是LIN初始化代码有问题,希望大佬们帮忙看下代码哪里有错误???谢谢
- void LIN1_Init(u8 mode, u32 baudRate)
- {
- u16 Temporary_Var_16;
- u32 Temporary_Var_32;
- memset(&linSlaveDataStr,0,sizeof(_linSlaveDataStr)); // 清空配置
- TIM2_Init();
- GPIO_InitTypeDef GPIO_InitStruct; // GPIO结构体
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
- AFIO->MAPR &= 0xF8FFFFFF;
- AFIO->MAPR |= 0x02000000; // 禁止SWD复用功能,关闭JTAG-DP,启用SW-DP,用于PB3 PA15
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3; // PIN3
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz
- GPIO_Init(GPIOB, &GPIO_InitStruct);
- GPIOB->ODR &= 0xFFFFFFF7; // PB3=0
- // PA15,推挽输出,50MHz,设为低电平
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
- GPIOB->ODR &= 0xFFFF7FFF; // PA15=0
- // PA9,复用推挽输出,50MHz,TX
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
- // PA10,上拉输入,设为高电平,RX
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
- GPIOA->ODR |= 0x00000400; // PA10=1
- USART_DeInit(USART1); // USART1复位
- // LIN模式下必须保持的
- USART1->CR1 &= 0xFFFFEFFF; // CR1[12]至0,1个起始位+8个数据位
- USART1->CR2 &= 0xFFFFC7FF;
- USART1->BRR = BaudrateCalculate( 72000000,baudRate);
- USART_LINCmd(USART1, ENABLE); // 使能LIN模式
- USART1->CR2 |= 0x0040; // LIN断开符检测中断使能
- USART_LINBreakDetectLengthConfig(USART1, USART_LINBreakDetectLength_11b); // 11位检测能力
- // 其他 USART 1 配置
- USART1->CR1 |= 0x202C; // 使能USART1 发送,接收,接收中断,并使能串口
- NVIC_EnableIRQ( USART1_IRQn );
- // 模式使能,mode=0取前,使能1K电阻;mode=1取后,关闭1K电阻
- while(TIM2_Delay(2,0)){}; TIM2_Delay(0,1); // 延时2ms,如果测试有问题,那就换成精确时钟函数!
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
- // 波特率<=10000取前,PA9=0低速模式,否则取后,PA9=1,高速模式
- if(baudRate <= 10000) {GPIOA->ODR &= 0xFFFFFDFF;} // PA9=0
- else GPIOA->ODR |= 0x00000200; //PA9=1
- while(TIM2_Delay( 2,0)){}; TIM2_Delay(0,1);
- GPIOB->ODR |= 0x00000008; // PA3=1
- while(TIM2_Delay( 2,0)){}; TIM2_Delay(0,1);
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
- GPIOA->ODR |= 0x00000200; //PA9=1
- }
复制代码
|
最佳答案
查看完整内容[请看2#楼]
已解决,前面要加
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ENABLE);
不然
AFIO->MAPR &= 0xF8FFFFFF;
AFIO->MAPR |= 0x02000000;
设置无效果
|