7 - 输入/输出:UART(串口)

UART是单片机与计算机通信的重要工具,可以外接蓝牙模块进行通信,也可以通过有线连接usb进行通信。
通过有线usb连接计算机时,单片机上只需连接TX,RX,GND,一般不需要连接VCC。
单片机的底层库一般都自带了UART通信模块,激活对应管脚,设定好波特率即可在程序中调用。
波特率决定数据的传输速率,波特率越高传输越快。一般为了稳定,传简单的数据用9600就够;传图像的话,最好用115200或以上,节省时间。

K60

K60用的是野火的底层库,可以参考它的手册;

输出

输出的话,定义好输出端口和波特率就能用。

uart_init (UART1,19200);   //初始化 串口 1 波特率为 19200
uart_putchar (UART1,'F');   //发送一个字符'F'
uart_sendStr (UART1,"uart_str 函数发送数据");  //发送字符串

开启Uart输入中断

// isr.h
// 串口输入中断服务
#undef VECTOR_061
#define VECTOR_061 UART0_IRQHandler
extern void UART0_IRQHandler(void);
// main.c
// main() 函数内
//打开串口中断
UART_IRQ_EN(UART0);

继续阅读“7 - 输入/输出:UART(串口)”

6 - 输入/输出:DMA

DMA, Direct Memory Access. 设定后,无需CPU干预即可将外设数据读到RAM中去。
摄像头组需要不断读取图像到内存,DMA可以分担图像读取的操作,大大减少了CPU的负担,于是我们可以有更多资源处理其他事情。
DMA另一个好处是可以跟着摄像头的PCLK读取数据,图像不会有噪点。
坏消息是,XS128不带DMA功能,呵呵。

通过DMA读取图像的方法:
1. 初始化摄像头管脚输入方向,初始化DMA;
2. 场中断到来,允许行中断;
3. 行中断到来,开启DMA,让DMA读取一行的数据;
4. 关闭DMA,等待下一次行中断。

继续阅读“6 - 输入/输出:DMA”

5 - 输入/输出:I2C

I2C是一种串行通信总线,维基百科有比较详细的介绍 http://zh.wikipedia.org/zh-cn/I%C2%B2C

它需要SDA和SCL两个接口来进行与外部硬件的通信。
我们用到的数字加速度计用的就I2C通信的,用I2C的好处是,它只占用2个管脚就可以读14bit精度的数据,且外部的电路自带了各种滤波,而AD转换要读取8bit就用掉8个管脚。
对I2C的工作方式,我的理解是,要用I2C读取外部硬件(比如数字加速度计),首先要向外部硬件发送“请求”,把要读取的寄存器地址请求过去,然后能得到相应的数据反馈。

4 - 输入/输出:FTM(PWM输出,脉冲计数)

本文将介绍K60(Freescale Kinetis K60)和XS128(Freescale S12XS128)的ADC用法。
K60使用了野火的12年版底层库,请参考《三天入门 Cortex-M4—Kinetis 系列 野火 Kinetics 开发板教程》。
XS128请参考飞思卡尔提供的Datasheet.

PWM模块产生脉冲,用于控制电机。通过改变其占空比,可以控制电机输出的大小。
脉冲计数(XS128的TIM)模块相当于一个计数器,可以对脉冲输入进行计数,用于测速编码器。
PWM输出和输入模块都不占用运算资源,只要配置好,它们就能自己工作。
K60的脉冲计数我忘了怎么做了,所以这里只提供XS128的方法。

继续阅读“4 - 输入/输出:FTM(PWM输出,脉冲计数)”

3 - 输入/输出:ADC(模数转换)

本文将介绍K60(Freescale Kinetis K60)和XS128(Freescale S12XS128)的ADC用法。
K60使用了野火的12年版底层库,请参考《三天入门 Cortex-M4—Kinetis 系列 野火 Kinetics 开发板教程》。
XS128请参考飞思卡尔提供的Datasheet.

ADC可以将电压信号转换成数字信号。
你可以配置它的读取精度,我这里用10bits或12bits。
以K60为例,如果配置精度为10bits,那么它就将3.3V电压平均分成1024份,数字输出为0则代表0V,输出1024则代表5V,输出512则代表2.5V。
同样,使用ADC之前,要对它进行初始化。

继续阅读“3 - 输入/输出:ADC(模数转换)”

2 - 输入/输出:GPIO

本文将介绍K60(Freescale Kinetis K60)和XS128(Freescale S12XS128)的GPIO用法。
K60使用了野火的12年版底层库,请参考《三天入门 Cortex-M4—Kinetis 系列 野火 Kinetics 开发板教程》。


GPIO是通用的输入输出口,你可以设定它的输入输出方向,进行相应的读写。
比如,控制LED灯,你需要设定LED对应管脚的GPIO为输出方向,然后程序中可以对这个管脚赋值从而控制其亮灭;
或者你要读取拨码开关的值,设置拨码对应的管脚为输入方向,程序中即可读取该管脚的电平。
在使用GPIO前,必须要进行初始化,声明输入输出方向。

K60

例子

参考了野火的例子,详见野火开发手册。

/*************************************************************************
*  实验说明:利用LED来显示电平高低(输出)
*  实验操作:无
*  实验效果:LED1每隔1s闪烁一次
*  实验目的:明白如何用51编程风格来设置IO口电平
*  修改时间:2012-2-28     已测试
*  备    注:龙丘P144系统板 LED0 - 3 接PTA14-17
             龙丘P100系统板 LED接PTA15
*  参    考:野火Kinetis开发例程
*************************************************************************/

void  main(void)
{
    uart0Printf("\nmain beginning...\n");
    gpio_init  (PORTA,15,GPO,HIGH);         //初始化 PTA15 :输出高电平 ,即 初始化 LED0,灭  
 
    while(1)
    {
        PTA15_OUT=0;                        //低电平点亮LED0
        delayms(500);                //延时500ms
        PTA15_OUT=1;                        //高电平熄灭LED0
        delayms(500);                //延时500ms
    }
}

继续阅读“2 - 输入/输出:GPIO”