完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
采用串口1,连接迪文屏,把调试的console关了,采用rxint方式接收, 调试过程中,发现点击屏幕,串口接收不到数据,我在串口接收中断里打的断点。请大家帮忙看看,谢谢 这是串口接收中断服务函数,我在第一行打断点都不会停 void USART1_IRQHandler(void) {
// uart_isr(&(uart_obj[UART1_INDEX].serial));
} if (dev == RT_NULL)
// return RT_EOK;
还有把控制台关了 #define RT_USING_DEVICE //#define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart1" #define RT_VER_NUM 0x40100 #define ARCH_ARM #define RT_USING_CPU_FFS #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M4 多谢 |
|
相关推荐
9个回答
|
|
参考文档中心的串口驱动小节 串口中断接收及轮询发送 ,使用 Rt-Thread 的驱动框架,不用修改串口的中断处理函数,代码示例如下。另外控制台串口无需关闭他俩互不干扰。
/* * 程序清单:这是一个 串口 设备使用例程 * 例程导出了 uart_sample 命令到控制终端 * 命令调用格式:uart_sample uart2 * 命令解释:命令第二个参数是要使用的串口设备名称,为空则使用默认的串口设备 * 程序功能:通过串口输出字符串"hello RT-Thread!",然后错位输出输入的字符 */ #include #define SAMPLE_UART_NAME "uart2" /* 用于接收消息的信号量 */ static struct rt_semaphore rx_sem; static rt_device_t serial; /* 接收数据回调函数 */ static rt_err_t uart_input(rt_device_t dev, rt_size_t size) { /* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */ rt_sem_release(&rx_sem); return RT_EOK; } static void serial_thread_entry(void *parameter) { char ch; while (1) { /* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */ while (rt_device_read(serial, -1, &ch, 1) != 1) { /* 阻塞等待接收信号量,等到信号量后再次读取数据 */ rt_sem_take(&rx_sem, RT_WAITING_FOREVER); } /* 读取到的数据通过串口错位输出 */ ch = ch + 1; rt_device_write(serial, 0, &ch, 1); } } static int uart_sample(int argc, char *argv[]) { rt_err_t ret = RT_EOK; char uart_name[RT_NAME_MAX]; char str[] = "hello RT-Thread!rn"; if (argc == 2) { rt_strncpy(uart_name, argv[1], RT_NAME_MAX); } else { rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX); } /* 查找系统中的串口设备 */ serial = rt_device_find(uart_name); if (!serial) { rt_kprintf("find %s failed!n", uart_name); return RT_ERROR; } /* 初始化信号量 */ rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO); /* 以中断接收及轮询发送模式打开串口设备 */ rt_device_open(serial, RT_DEVICE_FLAG_INT_RX); /* 设置接收回调函数 */ rt_device_set_rx_indicate(serial, uart_input); /* 发送字符串 */ rt_device_write(serial, 0, str, (sizeof(str) - 1)); /* 创建 serial 线程 */ rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10); /* 创建成功则启动线程 */ if (thread != RT_NULL) { rt_thread_startup(thread); } else { ret = RT_ERROR; } return ret; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(uart_sample, uart device sample); |
|
|
|
我用的串口1,和控制台的串口冲突,然后就去掉了。
这个还需要像标准库一样自己设置串口的接收中断吗?还是用cubemx设置?还是不需要设置,open的时候选择RT_DEVICE_FLAG_INT_RX就可以? 现在接收发送都不好使了。我用直接写入寄存器的方式发送的 USART1->DR=tx[t]; |
|
|
|
你用的是什么开发环境,没有多余的串口了?看一下 board.h 中的串口引脚
|
|
|
|
你好,我用的cubemx配置引脚,env添加功能,keil编写,编译。
board.h里只有堆栈的设置 #ifdef __cplusplus extern "C" { #endif #define STM32_SRAM_SIZE (128) #define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) #if defined(__ARMCC_VERSION) extern int Image$$RW_IRAM1$$ZI$$Limit; #define HEAP_BEGIN (&Image$$RW_IRAM1$$ZI$$Limit) #elif __ICCARM__ #pragma section="CSTACK" #define HEAP_BEGIN (__segment_end("CSTACK")) #else extern int __bss_end; #define HEAP_BEGIN (&__bss_end) #endif #define HEAP_END STM32_SRAM_END void SystemClock_Config(void); #ifdef __cplusplus } #endif #endif 我把代码上传了压缩包,有时间麻烦帮我看看哪里配置不对。谢谢 |
|
|
|
你的开发板没有多余的串口了吗?没有留出来单独的控制台串口?晚上回去帮你看看,单位不让用keil,我们都用 studio 进行代码的编写和调试,也是很方便的,可以考虑换一个开发环境试试。
|
|
|
|
硬件引出来3个,都占用了。谢谢。
|
|
|
|
STM32F407 那个型号的芯片?
|
|
|
|
|
|
|
|
应该是新建工程的时候进行设置的,我还不知道 env 创建 keil 工程时候怎么设置控制台的串口,使用 studio 创建工程的时候会配置控制台串口的引脚。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
798 浏览 0 评论
4836 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2622 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
2958 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
31763 浏览 11 评论
73100 浏览 21 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 21:56 , Processed in 0.821244 second(s), Total 87, Slave 70 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号