历史上的今天
今天是:2024年10月25日(星期五)
2019年10月25日 | AVR128单片机最小系统串口,外部中断,跑马灯,uCOS-II移植
2019-10-25 来源:51hei
实验名称:串口通信实验
功能描述:计算机通过串口向开发板发送数据,开发板将数据原样送回。
实验目的:学习串口通信
实验说明:MCU--M128
内部8M晶振
连接方式:利用串口线将开发板和计算机相连。
单片机源程序如下:
/************************************************
文件:sio.c
用途:结构化串口通信程序
************************************************/
#include "config.h"
#if USEUART0
siocirqueue RTbuf_UART0;
#endif
#if USEUART1
siocirqueue RTbuf_UART1;
#endif
#if (CPU_TYPE == M32)||(CPU_TYPE == M16)||(CPU_TYPE == M8)
#define USEUART0 TRUE
#define USEUART1 FALSE
#define iv_USART0_RXC iv_USART_RXC
#define iv_USART0_TXC iv_USART_TXC
#define UDR0 UDR
#define UCSR0A UCSRA
#define UCSR0B UCSRB
#define UCSR0C UCSRC
#define UBRR0H UBRRH
#define UBRR0L UBRRL
#define RXCIE0 RXCIE
#define TXCIE0 TXCIE
#endif
/*********************************************************************************************************
** 函数名称: Com_init
** 功能描述: 初始化串行口
** 输 入:
** 全局变量: 无
** 调用模块: Com_baudrate
** 说明:
** 注意:
********************************************************************************************************/
void Com_init (void) {
//WDR(); //喂狗
//CLI(); // 关中断
#if USEUART0
Tbuf_init(&RTbuf_UART0); //初始化接收缓冲
Rbuf_init(&RTbuf_UART0);
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A=0x00;
#if CPU_TYPE <= M32
UCSRC = (1< UCSR0C=0x06; //8 DATA ,1 STOP, NO PARITY UCSR0B = (1< #endif #if USEUART1 Tbuf_init(&RTbuf_B); //初始化接收缓冲 Rbuf_init(&RTbuf_B); UCSR1B = 0x00; //disable while setting baud rate UCSR1A = 0x00; UCSR1C = 0x06; UCSR1B = 0xD8; #endif Com_baudrate (9600); // //SEI(); // 开中断 } /********************************************************************************************************* ** 函数名称: Com_baudrate ** 功能描述: 利用定时器T1产生由参数baudrate指定的波特率 ** 输 入: baudrate指定的波特率 ** 全局变量: 无 ** 调用模块: 无 ** 说明: ** 注意: ********************************************************************************************************/ void Com_baudrate (unsigned int baudrate) { unsigned int tmp; tmp= F_CPU/baudrate/16-1; #if USEUART0 UBRR0H=(unsigned char)(tmp>>8); UBRR0L=(unsigned char)tmp; #endif #if USEUART1 UBRR1H=(unsigned char)(tmp>>8); UBRR1L=(unsigned char)tmp; #endif } /********************************************************************************************************* ** 函数名称: Com_putchar ** 功能描述: 从串行口输出一个字符c ** 输 入: c:输出字符 ** 输出 : 0:失败 1:成功 ** 全局变量: 无 ** 调用模块: ** 说明: ** 注意: ********************************************************************************************************/ unsigned char Com_putchar (unsigned char c,siocirqueue *RTbuf) { //WDR(); //喂狗 if (Tbuf_full(RTbuf)) return(0); else{ Tbuf_putchar(c,RTbuf); // 将数据加入到发送缓冲区并开中断 return(1); } } /********************************************************************************************************* ** 函数名称: Com_putstring ** 功能描述: 从串行口输出一个字符串 ** 输 入: p:指向输出字符串 len:输出长度 ** 输出 : ** 全局变量: 无 ** 调用模块: ** 说明: ** 注意: ********************************************************************************************************/ void Com_putstring (unsigned char *p,unsigned char len,siocirqueue *RTbuf) { unsigned char i; //WDR(); //喂狗 if (len!=0 ){ for(i=0;i } else { do{ while(Com_putchar(*p,RTbuf)==0);//WDR(); //喂狗; }while(*p++!='n'); } } /********************************************************************************************************* ** 函数名称: Com_getchar ** 功能描述: 从串行口输入一个字符 ** 输 入: mode:0不需等待,在调用函数前检测Com_R_count的值 ** 1 等待数据到来 ** 输出 : 读入的字符 ** 全局变量: 无 ** 调用模块: ** 说明: ** 注意: ********************************************************************************************************/ unsigned char Com_getchar (unsigned char mode,siocirqueue *RTbuf) { //WDR(); //喂狗 // Delay(Delay_Comget,MaxLimit_Comget_Delay); // if (mode>0) while(Com_R_count(RTbuf)==0 && !DelayOvf(Delay_Comget))//WDR(); //喂狗; // if (DelayOvf(Delay_Comget)) // return 0; //时间超时 // else while(!Com_R_count(RTbuf)); return (Rbuf_getchar(RTbuf));// 串行口输入正确,返回输入的字符 } void Com_Rbuf_Clear(siocirqueue *RTbuf){ Rbuf_init(RTbuf); } unsigned char Com_getstring (unsigned char *p,unsigned char len,siocirqueue *RTbuf) { unsigned char i=0; //WDR(); //喂狗 if (len>0 ){ for(i=0;i *p++=Com_getchar(1,RTbuf); } return(len); } else{ do{ *p++=Com_getchar(1,RTbuf); i++; //WDR(); //喂狗 }while(*(p-1)!='n'); // *p++=Com_getchar(1,RTbuf); // *(p)=0; return(i); } } /********************************************************************************************************* ** 函数名称: Com_R_count ** 功能描述: 返回接收缓冲区字符个数函数 ** 输 入: ** 输出 : 字符个数 ** 全局变量: 无 ** 调用模块: ** 说明: ** 注意: ********************************************************************************************************/ unsigned char Com_R_count(siocirqueue *RTbuf){ return RTbuf->R_count; } /********************************************************************************************************* ** 函数名称: Rbuf_init ** 功能描述: 接收缓冲区初始化 ** 输 入: ** 输出 : ** 全局变量: 无 ** 调用模块: ** 说明: ** 注意: ********************************************************************************************************/ void Rbuf_init(siocirqueue *RTbuf){ RTbuf->R_front=0; RTbuf->R_rear=0; RTbuf->R_count=0; RTbuf->R_overflow=0; } /********************************************************************************************************* ** 函数名称: Tbuf_init ** 功能描述: 发送缓冲区初始化 ** 输 入: ** 输出 : ** 全局变量: 无 ** 调用模块: ** 说明: ** 注意: ********************************************************************************************************/ void Tbuf_init(siocirqueue *RTbuf){ RTbuf->T_front=0; RTbuf->T_rear=0; RTbuf->T_count=0; RTbuf->T_disabled=1; } /********************************************************************************************************* ** 函数名称: Rbuf_empty ** 功能描述: 接收缓冲区判空 ** 输 入: ** 输出 : TRUE 空 FALSE 非空 ** 全局变量: 无 ** 调用模块: ** 说明: ** 注意: ********************************************************************************************************/ unsigned char Rbuf_empty(siocirqueue *RTbuf){ return RTbuf->R_count==0; } /********************************************************************************************************* ** 函数名称: Tbuf_empty ** 功能描述: 发送缓冲区判空 ** 输 入: ** 输出 : TRUE 空 FALSE 非空 ** 全局变量: 无 ** 调用模块: ** 说明: ** 注意: ******************************************************************************************************** unsigned char Tbuf_empty(void){ return RTbuf->T_count==0; } /*********************************************************************************************************
史海拾趣
|
前两三天找了和看了很多关于44b0中断的资料,结合了bootloader的代码,总算深入了解了44b0的向量和非向量的IRQ中断方式,但发现找不到HandleFIQ所对应的入口。请问FIQ中断是如何在uclinux下实现的?它如何实现区分发生了26种中断源中 ...… 查看全部问答> |
|
Linux IP:192.168.0.2 ARM 开发板IP:192.168.0.3 Linux自已mount nfs成功:mount -t nfs 192.168.0.2:/nfs /mnt/nfs Linux和开发板能Ping通,但开发板却不能mount Linux中的nfs共享目录: mount -t nfs -o nolock 192.16 ...… 查看全部问答> |
|
大家好,想请教个关于MOBILE下播放WAV的问题 最近在做个导航的测试,需要把各个语音文件给串起来播放,比如“前方”、“五”、“十”。。。。 我是用wave function进行处理的。起初我只用一个缓冲去,然后在我的主线程中开个线程进行语音播放处 ...… 查看全部问答> |
|
在使用 Altera 的 FPGA 时候,根据系统设计需要在管脚的内部加上上拉电阻。Quartus II 软件中在 Assignment 的 Pin Planner中可以设置。具体过程如下: 1. 在菜单 Ass ...… 查看全部问答> |
|
加速度传感器能够准确的测量被测物体的加速度信息,从而获知其当前的运动状态,包括位置,速度和加速度。加速度传感器已广泛应用于各类消费电子产品中。本设计正是基于ADI的两轴加速度传感器ADXL320而设计的,它能够精确地测量出佩戴者行走的步数, ...… 查看全部问答> |
|
DIY 太阳能自动跟踪阳光系统,视频+多图~~~ 图片是从视频中接的图不清楚,高清图已经附上貌似之前的图片删不掉了,,, $(\'flv_KY8\').innerHTML=(mobileplayer() ? \"\" : AC_FL_RunContent(\'width\', \'500\', \'height\', \'375\', \'allowN ...… 查看全部问答> |
|
【实验内容】基于FSPAD_702平板,实现串口通信。 【实验目的】熟悉FSPAD_702平板串口通信的整体流程。 【实验环境】Ubuntu 10.04虚拟机,FSPAD_702开源平板,usb转网口模块,usb转串口数据线等 ...… 查看全部问答> |




