完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
6个回答
|
|
串口2的程序好像跟有没有用UCOS是一样的啊, 有UCOS的最多在中断函数里加上 中断调度指令就行了吧!
我倒是有一个485通信的,你自已看看,我用在设备上2年了,没有出现过问题 /************************************************************************************** 模块名称: RS485驱动代码(第七代自动机) 文件名称: RS485.C 版 本: V1.0 说 明: 日 期: 2013年5月17日 作 者: likunxue C P U : STM32F103ZE 主频: 72MHz Copyright (C), 2013-2020, 贵州惠水昶达数控有限公司 修改记录: 2013年9月2号修改为新主板 支持UCOS操作系统 **************************************************************************************/ #include "sys.h" #include "rs485.h" #include "delay.h" #include "MOTOR.H" //步进电机配置头文件 #include "CanShuSheZhi.H" //机台参设置函数部份 #include "malloc.h" //内存管理 #if SYSTEM_SUPPORT_UCOS //如果使用ucos,则包括下面的头文件即可 #include "includes.h" //ucos 使用 #include "APP_CFG.H" //工程项目文件 #endif vu32 RX_Lang; //串口接收的32位参数 vu16 RX_BYTE; //串口收到的16位参数 vu8 RX_DAT; //串口接收中的低7位数据寄存器 vu8 RX_QianZhiLing; //串口接收中的低位接收标志位 vu8 RX_STR; //串口接收缓存区指针 vu8 RX_OK; //串口接收完成标志寄存器 vu8 RX_Buf[SUA_SIZE]; //串口接收缓存数据区 vu8 TX_Buf[SUA_SIZE]; //串口2发送缓存区 /*************************************************************************************** 函 数 名: DMA1的各通道配置 这里的传输形式是固定的,这点要根据不同的情况来修改 从存储器->外设模式/8位数据宽度/存储器增量模式 调 用: UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar) 参 数: DMA_CHxMA通道CHx cpar:外设地址 cmar:存储器地址 返 回 值: 无 ***************************************************************************************/ void UART_DMA_Config(u32 cpar,u32 cmar) { RCC->AHBENR |= 1<<0; //开启DMA1时钟 delay_us(5); DMA1_Channel7->CPAR = cpar; //DMA1 外设地址 DMA1_Channel7->CMAR = cmar; //DMA1,存储器地址 DMA1_Channel7->CCR = 0x00000000; //复位 BIT_ADM(DMA1_Channel7->CCR, 4) = 1; //从存储器读 BIT_ADM(DMA1_Channel7->CCR, 5) = 0; //普通模式 BIT_ADM(DMA1_Channel7->CCR, 6) = 0; //外设地址非增量模式 BIT_ADM(DMA1_Channel7->CCR, 7) = 1; //存储器增量模式 BIT_ADM(DMA1_Channel7->CCR, 8) = 0; //外设数据宽度为8位 BIT_ADM(DMA1_Channel7->CCR,10) = 0; //存储器数据宽度8位 BIT_ADM(DMA1_Channel7->CCR,12) = 1; //中等优先级 BIT_ADM(DMA1_Channel7->CCR,14) = 0; //非存储器到存储器模式 } /************************************************************************************* 函 数 名: 初始化IO 串口2 调 用: 无 参 数: pclk1CLK1时钟频率(Mhz) bound:波特率 反 回 值: 无 **************************************************************************************/ void RS485_Init(u32 pclk1,u32 bound) { float temp; u16 i,mantissa,fraction; for(i =0; i< SUA_SIZE; i++){RX_Buf = 0; TX_Buf = 0;}//接收缓存区 RX_BYTE = 0; //串口收到的16位参数 RX_DAT = 0; //串口接收中的低7位数据寄存器 RX_QianZhiLing = 0; //串口接收中的低位接收标志位 RX_STR = 0; //串口接收缓存区指针 RX_OK = 0; //串口接收完成标志寄存器 temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV mantissa=temp; //得到整数部分 fraction=(temp-mantissa)*16; //得到小数部分 mantissa<<=4; mantissa+=fraction; RCC->APB2ENR |= 1<<2; //使能PORTA口时钟 GPIOA->CRL &= 0xFFFF00FF; //IO状态设置 GPIOA->CRL |= 0x00008B00; //IO状态设置 GPIOA->ODR |= 1<<3; //置上拉 RCC->APB2ENR |= 1<<4; //使能外设PORTC时钟 GPIOC->CRL &= 0xffffff00; //PC0,PC1设为输出 GPIOC->CRL |= 0x00000033; GPIOC->ODR |= 1<<0; //置上拉,初始化高电平 GPIOC->ODR |= 1<<1; //置上拉,初始化高电平 RCC->APB1ENR |= 1<<17; //使能串口时钟 RCC->APB1RSTR |= 1<<17; //复位串口2 RCC->APB1RSTR &= ~(1<<17); //停止复位 //波特率设置 USART2->BRR=mantissa; //波特率设置 USART2->CR1 |= 1<<13; //串口2使能(UE,USATR) USART2->CR1 |= 1<<2; //接收使能(RE) USART2->CR1 |= 1<<3; //发送使能(TE) USART2->CR1 |= 1<<8; //PE中断使能 USART2->CR1 |= 1<<5; //接收缓冲区非空中断使能 USART2->CR3 = 1<<7; //使能串口2的DMA发送 //DMA1通道7,外设为串口2,存储器为USART2_TX_BUF UART_DMA_Config((u32)&USART2->DR,(u32)TX_Buf); //初始化DMA MY_NVIC_Init(0,0,USART2_IRQn,4); //抢占5,子优先级0,组4 } /************************************************************************************* 函 数 名: RS485中断接收函数(双字节指令模式) 调 用: 无 参 数: 无 反 回 值: 无 自定义数据接收格式 **************************************************************************************/ void USART2_IRQHandler(void) { #if SYSTEM_SUPPORT_UCOS //如果使用ucos, OSIntEnter(); //进入中断 #endif if(USART2->SR&(1<<5)) //接收到数据 { u8 K = USART2->DR; //读取串口数据 USART2->SR &= ~(1<<5); //清中断接收标志位 if(K < 0x80){RX_DAT = K;RX_QianZhiLing = 0xE5;}//数据低7位 else{ u8 Bul = K & 0xf8; //得到指令码 if(RX_QianZhiLing == 0XE5) { //双字节指令解码部份 switch(Bul) { case 0x80:{//是数据字节(0x80) if(RX_STR >SUA_SIZE)RX_STR = 0; RX_Buf[RX_STR ++ ]= (K <<7)+RX_DAT;//RX_BYTE; }break; case 0x88:{RX_STR = 0; RX_Buf[RX_STR ++] = (K <<7)+RX_DAT;}break;//多字节参数初始化 case 0x90:{//接收双字节数据包,10位有效数据 RX_BYTE = (((u16)(K & 0x07))<<7)|RX_DAT; //得到有效数据(10位) RX_OK = 0xE5; //置接收完成标志 }break; case 0x98:{//收到电机坐标值或编码器的状态值(双字节,16位) RX_BYTE = (((((u16)(K & 0x07))<<7)|RX_DAT)<<8)+ RX_Buf[0]; //得到参数 RX_OK = 0xE5;//置接收完成标志 }break; case 0xA0:{//接收4个字节 32位 RX_Lang = (K <<7)+RX_DAT; RX_Lang <<= 8; RX_Lang |= RX_Buf[2]; RX_Lang <<= 8; RX_Lang |= RX_Buf[1]; RX_Lang <<= 8; RX_Lang |= RX_Buf[0]; RX_OK = 0xE5;//置接收完成标志 }break; } } RX_QianZhiLing = 0x80; //清标志位 } } #if SYSTEM_SUPPORT_UCOS //如果使用ucos, OSIntExit(); //触发任务切换软中断 #endif } /************************************************************************************** 函 数 名: 申请485总线使用权等待函数 调 用: SUA_ShiYongQuan(u32 JiShuQi) 参 数: JiShuQi 等待计数器 返 回 值: 无 说 明: 如果总线在使用中,则按给定的时间等待总线工作完成 然后再置使用标志位 如果定时器2在工作中,禁止申请 ***************************************************************************************/ void SUA_ShiYongQuan(void) { u8 err; while(TIM_TR2 == 1); //电机工作期间,禁止申请485总线 OSMutexPend(sem_SUA,100,&err); //申请互斥信号量,会在址一直等待 if(err == OS_ERR_NONE ) { while(DMA1_Channel7->CNDTR != 0); //等待通道7传输完成 BIT_ADM(DMA1_Channel7->CCR ,0) = 0; //关闭DMA传输 return; } else{ OSMutexPost(sem_SUA); //释放485使用权 ERR_BPPK("485总线占用超时了 "); } } |
|
|
|
我也像你一样加了蓝色部分程序,还是不行,我测过我移植的ucosii应该能用的,我把代码贴出来了你帮忙看下呗,第一次玩ucosii,请多多指教!
|
|
|
|
|
|
#include "delay.h"
#include "sys.h" #include "usart2.h" #include "stdarg.h" #include "stdio.h" #include "string.h" #include "common.h" #if SYSTEM_SUPPORT_OS #include "includes.h" #endif __align(8) u8 USART2_TX_BUF[USART2_MAX_SEND_LEN]; #ifdef USART2_RX_EN u8 USART2_RX_BUF[USART2_MAX_RECV_LEN]; u16 USART2_RX_STA=0; void USART2_IRQHandler(void) { u8 res; #if SYSTEM_SUPPORT_OS OSIntEnter(); #endif // LED1=~LED1; if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) { res =USART_ReceiveData(USART2); if(USART2_RX_STA TIM_SetCounter(TIM4,0); if(USART2_RX_STA==0)TIM4_Set(1); USART2_RX_BUF[USART2_RX_STA++]=res; }else { USART2_RX_STA|=1<<15; } } #if SYSTEM_SUPPORT_OS OSIntExit(); #endif } void USART2_Init(u32 bound) { NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); USART_DeInit(USART2); //USART2_TX PA.2 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); //USART2_RX PA.3 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = bound; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, &USART_InitStructure); // USART2->BRR=(pclk1*1000000)/(bound); //USART2->CR1|=0X200C; USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE); UART_DMA_Config(DMA1_Channel7,(u32)&USART2->DR,(u32)USART2_TX_BUF); USART_Cmd(USART2, ENABLE); #ifdef USART2_RX_EN USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM4_Init(999,7199); USART2_RX_STA=0; TIM4_Set(0); #endif } void u2_printf(char* fmt,...) { va_list ap; va_start(ap,fmt); vsprintf((char*)USART2_TX_BUF,fmt,ap); va_end(ap); while(DMA_GetCurrDataCounter(DMA1_Channel7)!=0); UART_DMA_Enable(DMA1_Channel7,strlen((const char*)USART2_TX_BUF)); } void TIM4_IRQHandler(void) { if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) { USART2_RX_STA|=1<<15; TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); TIM4_Set(0); } } void TIM4_Set(u8 sta) { if(sta) { TIM_SetCounter(TIM4,0); TIM_Cmd(TIM4, ENABLE); }else TIM_Cmd(TIM4, DISABLE); } void TIM4_Init(u16 arr,u16 psc) { NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //¶¨Ê±Æ÷TIM3³õʼ»¯ TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler =psc; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } #endif void UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar) { DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_DeInit(DMA_CHx); DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; DMA_InitStructure.DMA_MemoryBaseAddr = cmar; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 0; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA_CHx, &DMA_InitStructure); } void UART_DMA_Enable(DMA_Channel_TypeDef*DMA_CHx,u8 len) { DMA_Cmd(DMA_CHx, DISABLE ); DMA_SetCurrDataCounter(DMA_CHx,len); DMA_Cmd(DMA_CHx, ENABLE); } |
|
|
|
[AppleScript] 纯文本查看 复制代码
#include "common.h"#include "24l01.h"#include "spi.h"#include "string.h"#include "includes.h"OS_TMR * tmr1; u8 *p;u8 constate=0; u8 Tx_Buf[32];void main_task(void *pdata){ u8 i; u8 err; OS_CPU_SR cpu_sr=0; u8 Rx_Buf[32]; u8 tmp_buf[32]={"1234"}; u8 tmp_buf1[10]; u8 tmp_buf2[10]; while(1) { OS_ENTER_CRITICAL(); u2_printf("%s",tmp_buf); OS_EXIT_CRITICAL(); delay_ms(200); // atk_rm04_at_response(1); }// myfree(p); }void usart2_task(void *pdata){ u16 rlen=0; char s1[5]="off"; char s2[5]="open"; while(1) { if(USART2_RX_STA&0X8000) { rlen=USART2_RX_STA&0X7FFF; USART2_RX_BUF[rlen]=0; POINT_COLOR=BLUE; LCD_Fill(30,145,239,319,WHITE); Show_Str(30,145,180,190,USART2_RX_BUF,12,0); USART2_RX_STA=0; } delay_ms(10); }}void lianjie_task(void *pdata){ static u8 t=24; u8 flag,flag1; OS_CPU_SR cpu_sr=0; while(1) { delay_ms(3000); } } #include "led.h" #include "delay.h" #include "sys.h" #include "usart.h" #include "lcd.h" #include "key.h" #include "usmart.h" #include "malloc.h" #include "24l01.h" #include "fontupd.h" #include "text.h" #include "common.h" #include "usart2.h" #include "includes.h" #define START_TASK_PRIO 10 #define START_STK_SIZE 128 OS_STK START_TASK_STK[START_STK_SIZE]; void start_task(void *pdata); #define USART2_TASK_PRIO 4 #define USART2_STK_SIZE 128 OS_STK USART2_TASK_STK[USART2_STK_SIZE]; void usart2_task(void *pdata); #define MAIN_TASK_PRIO 3 #define MAIN_STK_SIZE 128 OS_STK MAIN_TASK_STK[MAIN_STK_SIZE]; void main_task(void *pdata); #define LIANJIE_TASK_PRIO 2 #define LIANJIE_STK_SIZE 64 OS_STK LIANJIE_TASK_STK[LIANJIE_STK_SIZE]; void lianjie_task(void *pdata); // OS_EVENT * msg_key; int main(void) { delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); uart_init(115200); LCD_Init(); LED_Init(); KEY_Init(); NRF24L01_Init(); mem_init(); font_init(); atk_rm04_init(); atk_rm04_test(); OSInit(); OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO ); OSStart(); } void start_task(void *pdata) { OS_CPU_SR cpu_sr=0; // msg_key=OSMboxCreate((void*)0); // OSStatInit(); // LED1=0; OS_ENTER_CRITICAL(); OSTaskCreate(main_task,(void *)0,(OS_STK*)&MAIN_TASK_STK[MAIN_STK_SIZE-1],MAIN_TASK_PRIO); OSTaskCreate(usart2_task,(void *)0,(OS_STK*)&USART2_TASK_STK[USART2_STK_SIZE-1],USART2_TASK_PRIO); OSTaskCreate(lianjie_task,(void *)0,(OS_STK*)&LIANJIE_TASK_STK[LIANJIE_STK_SIZE-1],LIANJIE_TASK_PRIO); OSTaskSuspend(START_TASK_PRIO); OS_EXIT_CRITICAL(); } |
|
|
|
@likunxue 代码在上面了
|
|
|
|
只有小组成员才能发言,加入小组>>
702 浏览 0 评论
1111 浏览 1 评论
2476 浏览 5 评论
2811 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2654 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
658浏览 9评论
659浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
788浏览 6评论
633浏览 5评论
677浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 02:33 , Processed in 1.061091 second(s), Total 90, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号