完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位大侠,我利用w806kit上的boot做外部中断,为什么进终端会抛出异常? #include #include "wm_hal.h" #include "fifo.h" UART_HandleTypeDef huart1; static void UART1_Init(void); #define IT_LEN 0 // 大于等于0,0:接收不定长数据即可触发中断回调;大于0:接收N个长度数据才触发中断回调 static uint8_t buf[32] = {0}; // 必须大于等于32字节 #define LEN 2048 static uint8_t pdata[LEN] = {0}; void Error_Handler(void); static void GPIO_Init(void); void Error_Handler(void); static volatile uint8_t key_flag = 0; int main(void) { volatile int tx_len = 0; uint8_t tx_buf[100] = {0}; SystemClock_Config(CPU_CLK_160M); printf("rnrnSystemClock_Config(CPU_CLK_160M);rn"); HAL_Init();//empty function printf("Start GPIO_Int();rn"); GPIO_Init(); UART1_Init(); FifoInit(pdata, LEN); HAL_UART_Receive_IT(&huart1, buf, IT_LEN); // 只需调用一次,接收够设定的长度,进入中断回调,用户需要在中断回调中取走数据,此处设置了 // 0个字节,即不定长 printf("enter mainrn"); while (1) { //下载时连接不上多按几次reset /*key_flag = 0; HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); if (key_flag == 1) { HAL_Delay(20); if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == GPIO_PIN_RESET) { HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); } key_flag = 0; }*/ printf("hddgf@126.com %drn",key_flag); HAL_Delay(100); //HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,1); //HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,1); //HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2,1); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_PIN_SET);//1 if(key_flag%3==0) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,0); } else if(key_flag%3==1) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,0); } else { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2,0); } key_flag++; tx_len = FifoDataLen(); if (tx_len > 0) { tx_len = (tx_len > 100) ? 100 : tx_len; FifoRead(tx_buf, tx_len); HAL_UART_Transmit(&huart1, tx_buf, tx_len, 1000); } } return 0; } static void UART1_Init(void) { huart1.Instance = UART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX | UART_MODE_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (FifoSpaceLen() >= huart->RxXferCount) { FifoWrite(huart->pRxBuffPtr, huart->RxXferCount); } } static void GPIO_Init(void) { /*GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIO_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_PIN_SET);//1 */ /* GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_NVIC_SetPriority(GPIOB_IRQn, 5); HAL_NVIC_EnableIRQ(GPIOB_IRQn);//CPU Exception : 47 */ //Boot Button /*GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_NVIC_SetPriority(GPIOA_IRQn, 5); HAL_NVIC_EnableIRQ(GPIOA_IRQn);*/ GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIO_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_PIN_SET); // GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Pin = GPIO_PIN_0; // for PA0 GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; // HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // for PA0 // HAL_NVIC_SetPriority(GPIOB_IRQn, 0); // HAL_NVIC_EnableIRQ(GPIOB_IRQn); HAL_NVIC_SetPriority(GPIOA_IRQn, 0); // for PA0 HAL_NVIC_EnableIRQ(GPIOA_IRQn); // for PA0 } void HAL_GPIO_EXTI_Callback(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) { /*if ((GPIOx == GPIOA) && (GPIO_Pin == GPIO_PIN_0)) { key_flag = 0;//进入中断会报错 CPU Exception : 46 why?? }*/ if ((GPIOx == GPIOB) && (GPIO_Pin == GPIO_PIN_5)) { key_flag = 1; } if ((GPIOx == GPIOA) && (GPIO_Pin == GPIO_PIN_0)) // for PA0 { key_flag++; } } void Error_Handler(void) { while (1) { } } void assert_failed(uint8_t *file, uint32_t line) { printf("Wrong parameters value: file %s on line %drn", file, line); } |
|
相关推荐
2 个讨论
|
|
是 的... 中断入口函数没有抄全,加上下面几个函数,可以了。。
#include "wm_hal.h" __attribute__((isr)) void CORET_IRQHandler(void) { uint32_t temp; temp = (*(volatile unsigned int *) (0xE000E010)); HAL_IncTick(); } __attribute__((isr)) void GPIOA_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIOA, GPIO_PIN_0); } __attribute__((isr)) void GPIOB_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIOB, GPIO_PIN_5); } |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
248个成员聚集在这个小组
加入小组【联盛德W806-KIT开发板试用体验】使用官方SDK,并点亮所有GPIO端口
3760 浏览 0 评论
【联盛德W806-KIT开发板试用体验】+硬件SPI驱动ST7780_240X240_LCD
2940 浏览 1 评论
3870 浏览 2 评论
【联盛德W806-KIT开发板试用体验】+ GPIO驱动LED灯
2826 浏览 0 评论
【联盛德W806-KIT开发板试用体验】彩色OLED屏的显示驱动
2598 浏览 0 评论
659浏览 0评论
635浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 20:14 , Processed in 0.694184 second(s), Total 68, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号