完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
将《编程指南》中设备驱动部分的例子在STM32f107金牛开发板上运行,编译通过,但是无法正常运行,代码如下,驱动部分没有变动,请帮忙看下哪部分有问题?还是缺少了哪一部分?多谢了。
#include #include #define UART1_GPIO GPIOA #define UART1_GPIO_RX (GPIO_Pin_10) #define UART1_GPIO_TX (GPIO_Pin_9) void rt_hw_message_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 , ENABLE); GPIO_InitStructure.GPIO_Pin = UART1_GPIO_RX; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOAtiNG; GPIO_Init(UART1_GPIO, &GPIO_InitStructure); /* Configure USART1 Tx (PA.09) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = UART1_GPIO_TX; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(UART1_GPIO, &GPIO_InitStructure); } //UART接收消息结构 struct rx_msg { rt_device_t dev; rt_size_t size; }; //用于接收消息的消息队列 static rt_mq_t rx_mq; //接收线程的接收缓冲区 static char uart_rx_buffer[64]; //数据达到回调函数 rt_err_t uart_input(rt_device_t dev,rt_size_t size) { struct rx_msg msg; msg.dev=dev; msg.size=size; //发送消息到消息队列中 rt_mq_send(rx_mq,&msg,sizeof(struct rx_msg)); return RT_EOK; } static void rt_message_thread_entry(void* parameter) { int count=0; struct rx_msg msg; rt_device_t device,write_device; rt_err_t result=RT_EOK; rt_hw_message_init(); device=rt_device_find("USART1"); if(device!=RT_NULL) { //设置回调函数及打开设备 rt_device_set_rx_indicate(device,uart_input); rt_device_open(device,RT_DEVICE_OFLAG_RDWR); } //设置写设备 write_device=device; while(1) { //从消息队列中读取消息 result=rt_mq_recv(rx_mq,&msg,sizeof(struct rx_msg),50); if(result==-RT_ETIMEOUT) { //接收超时 rt_kprintf("timeout count:%d ,++count"); } //成功收到信息 if(result==RT_EOK) { rt_uint32_t rx_length; rx_length=(sizeof(uart_rx_buffer)-1)>msg.size? msg.size:sizeof(uart_rx_buffer)-1; //读取消息 rx_length=rt_device_read(msg.dev,0,&uart_rx_buffer[0],rx_length); uart_rx_buffer[rx_length]=''; //写到写设备中 if(write_device!=RT_NULL) rt_device_write(write_device,0,&uart_rx_buffer[0],rx_length); } } } int rt_application_init() { rt_thread_t message_thread; message_thread=rt_thread_create("message", rt_message_thread_entry,RT_NULL, 1024,10,10); rt_thread_startup(message_thread); } |
|
相关推荐
8个回答
|
|
指南中多少页的代码?
|
|
|
|
143页的
|
|
|
|
这个代码你是否调试过?
用list_device()查看过当前系统中存在的设备吗?从你的代码来看,如果驱动代码你未改过的话, device=rt_device_find("USART1"); 这句话返回的肯定是RT_NULL,即系统中不存在以USART1为名字的设备。RTT是不推荐使用大写形式的名字信息。 |
|
|
|
编译是通过的,将device=rt_device_find("USART1");中的USART1改成了uart1,还是无法正常运行。
代码的目的是通过串口调试软件,向USART1中输入数据,产生接收中断,然后将接收到的数据返回给电脑。 有两点疑问: 1、是否需要在application.c中对“消息队列”和usart1初始化,如何初始化; 2、STM32F107的金牛开发板不能仿真,如何使用list_device()查看过当前系统中存在的设备呢? |
|
|
|
建议,入门时:
先跑kernel + led 然后是kernel + finsh shell finsh shell在RT-Thread里占据极为重要的角色,如果不了解shell的操作、使用方法,再去接触其他的都是吃力的。 在有了kernel + finsh shell之后,可以慢慢接触一些kernel example,然后才是device。 |
|
|
|
好的,谢谢提示。
|
|
|
|
V 0.3.0 版本中,包括在V1.0.0 同样, 无法采用UART1 的接收的问题:
这里的原因: 在启动代码里(start_rvds.s): DCD USART1_IRQHandler ; USART1 但是在uart.c 文件内,没有定义: 这个中断的服务。 所以ARMCC 采取的默认程序,就是WHILE(1); 但是在serial.c 内 完成定义一个串口中断的接收服务函数: /* ISR for serial interrupt */ void rt_hw_serial_isr(rt_device_t device) { rt_base_t level; struct stm32_serial_device* uart = (struct stm32_serial_device*) device->private; struct stm32_serial_int_rx* int_rx = uart->int_rx; if(USART_GetITStatus(uart->uart_device, USART_IT_RXNE) != RESET) { /* interrupt mode receive */ RT_ASSERT(device->flag & RT_DEVICE_FLAG_INT_RX); /* save on rx buffer */ while (uart->uart_device->SR & USART_FLAG_RXNE) { /* disable interrupt */ level = rt_hw_interrupt_disable(); /* save character */ int_rx->rx_buffer[int_rx->save_index] = uart->uart_device->DR & 0xff; int_rx->save_index ++; if (int_rx->save_index >= UART_RX_BUFFER_SIZE) int_rx->save_index = 0; /* if the next position is read index, discard this 'read char' */ if (int_rx->save_index == int_rx->read_index) { int_rx->read_index ++; if (int_rx->read_index >= UART_RX_BUFFER_SIZE) int_rx->read_index = 0; } /* enable interrupt */ rt_hw_interrupt_enable(level); } /* clear interrupt */ USART_ClearITPendingBit(uart->uart_device, USART_IT_RXNE); /* invoke callback */ if (device->rx_indicate != RT_NULL) { rt_size_t rx_length; /* get rx length */ rx_length = int_rx->read_index > int_rx->save_index ? UART_RX_BUFFER_SIZE - int_rx->read_index + int_rx->save_index : int_rx->save_index - int_rx->read_index; device->rx_indicate(device, rx_length); } } if (USART_GetITStatus(uart->uart_device, USART_IT_TC) != RESET) { /* clear interrupt */ USART_ClearITPendingBit(uart->uart_device, USART_IT_TC); } } 解决方法: 1) 在uart.c 文件内加入: 位置在 #if def RT_USING_UART1 的有效范围内: void USART1_IRQHandler() __attribute__ ((alias("Rt_uart1_irq_handler"))); void Rt_uart1_irq_handler(void) { /* Call into the generic code to handle the IRQ for this specific device */ rt_hw_serial_isr( & uart1_device); } 不知大侠,这样是否正确? |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
842 浏览 0 评论
6562 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2869 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
3105 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
33536 浏览 11 评论
73750 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-5 10:15 , Processed in 0.823513 second(s), Total 85, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号