你先一步一步的实验,单独的进行按键测试,先按键跟数码管一起,按键按一下,数码管数值加1,看看是不是达到你想要的目的,然后,进行串口通信, 串口助手发送,单片机接收,然后单片机发送一个数值给串口助手。 两个都完成,然后再结合到一起去, 我不知道你的程序有什么问题,但是尽量不要用delay函数,可以用定时器进行按键的扫描 和 串口定时发送数据
是有osalTimeUpdate()和Hal_ProcessPoll()这两个函数。
cc2530中OSALAPI接口函数:
信息管理API
osal_msg_allocate( )函数原型:任务是分配一个信息缓冲区,当任务调用或函数被调用时,该空间被信息填充或调用信息发送函数osal_msg_send() 发送缓冲空间的信息到其他任务,若该缓冲空间不能被分配,则设置msg_ptr=NULL空;
uint8 osal_msg_allocate( uint16 len ),返回的是指针,若返回为空,则该信息缓存空间分配失败。
注:该函数不能与osal_mem_alloc()混淆,osal_mem_alloc()函数是用于为在任务间发送信息分配缓冲区。该函数可以分配一个存储空间。
因为有一些需要由客户自己指定的数据,如WIFI的网络名、密码等,不能固定在下载程序中,所以可以使用NV,由用户自己确定。
NV *** 作主要实际下面三个函数:osal_nv_item_init、osal_nv_write、osal_nv_read
关于cc2530NV读取的简单代码例子:
需要注意的是,虽然NV可写入地址范围从 0x0401 – 0x0FFF,但是一定要注意,地址应该是 %4=1,如:0x401为十进制1025,1025%4=1;不能是%4=0,至于为什么是%4,可以参照cc2530手册。
另外在某地址第一次读写时,结果可以使用!=SUCCESS来判断,但如果这个地址已经被初始化过并写入过数据,再一次被初始化过,如果还是用!=SUCCESS是不行的,因为此时即使没数据,但读取也是SUCCESS!
#define PATHS_ID 0x0601
#define WIFI_NAME 0x0A01
#define WIFI_PWD 0x0A29
void writeNV(){
osal_nv_item_init(PATHS_ID ,1,NULL);//每次写入前必须先初始化
uint8 sfcsh=0;
uint8 su_b=osal_nv_write(PATHS_ID ,0,1,&sfcsh);//写入标志
uint8 su_n= osal_nv_item_init(WIFI_NAME,40,NULL);
uint8 su_p= osal_nv_item_init(WIFI_PWD,40,NULL);
if((su_b==SUCCESS)&&(su_n==SUCCESS)&&(su_p==SUCCESS)){
HalLcdWriteString("init _ok", HAL_LCD_LINE_1 );
}
}
uint8 readNV(){
uint8 pshuju;
uint8 yuu =osal_nv_read(PATHS_ID,0,sizeof(pshuju),pshuju);
if(yuu==SUCCESS){
if( pshuju==0)
{
return 0;
}else
{
return 1;
}
}
CC2430包括2个串行通信接口 USART0 与 USART1,每个串口包括两个模式:UART(异步)模式、SPI(同步)模式,本节仅涉及UART模式)。两个USART具有同样的功能,可以设置在单独的I/O 引脚
P0_2、P0_3配置为外设功能时:P0_2为RX, P0_3为TXUSART0和USART1是串行通信接口,它们能够分别运行于异步UART模式或者同步SPI 模式。两个USART具有同样的功能,可以设置在单独的I/O 引脚。
相关寄存器为UxCSR、UxCSR、UxGCR、UxBUF、UxBAUD、CLKCONCMD、CLKCONSTA,具体的参数参看datesheet。
CC2530配置串口的一般步骤:
1、 配置IO,使用外部设备功能。此处配置P0_2和P0_3用作串口UART0
2、 配置相应串口的控制和状态寄存器。
3、 配置串口工作的波特率。
寄存器具体配置如下:
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x0c; //P0_2,P0_3用作串口(外部设备功能)
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //设置为UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200 根据上面表中获得的数据
UTX0IF = 0; //UART0 TX 中断标志初始置位 0
/
描 述: 设置串口调试助手波特率:115200bps 8N1
会收到 CC2530 发过来的:Hello Zigbee
/
#include <ioCC2530h>
#include <stringh>
typedef unsigned char uchar;
typedef unsigned int uint;
#define TX_SIZE 20
#define TX_STRING "Hello Zigbee "
char TxData[TX_SIZE]; //存储发送字符串
/
名 称: DelayMS()
功 能: 以毫秒为单位延时
入口参数: msec 延时参数,值越大延时越久
出口参数: 无
/
void DelayMS(uint msec)
{
uint i,j;
for (i=0; i<msec; i++)
for (j=0; j<1070; j++);
}
/
名 称: InitUart()
功 能: 串口初始化函数
/
void InitUart(void)
{
PERCFG = 0x00; //外设控制寄存器 USART 0 的 IO 位置:0 为 P0 口位置 1
P0SEL = 0x0c; //P0_2,P0_3 用作串口(外设功能)
P2DIR &= ~0XC0; //P0 优先作为 UART0
U0CSR |= 0x80; //设置为 UART 方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为 115200
UTX0IF = 0; //UART0 TX 中断标志初始置位 0
}
/
名 称: UartSendString()
功 能: 串口发送函数
入口参数: Data:发送缓冲区 len:发送长度
出口参数: 无
/
void UartSendString(char Data, int len)
{
uint i;
for(i=0; i<len; i++)
{
U0DBUF = Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
/
程序入口函数
/
void main(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为 32MHZ 晶振
while(CLKCONSTA & 0x40); //等待晶振稳定为 32M
CLKCONCMD &= ~0x47; //设置系统主时钟频率为 32MHZ
InitUart(); //调置串口相关寄存器
memset(TxData, 0, TX_SIZE); //数据清 0
memcpy(TxData, TX_STRING, sizeof(TX_STRING));//复制发送字符串到 TxData
while(1)
{
UartSendString(TxData, sizeof(TX_STRING)); //串口发送数据
DelayMS(1000); //延时 1 秒
}
}
UTX0IF = 1; UART0发送完成标志位1
while(UTX0IF); //表示等待串口, 直到数据发送完成 如果用延时, 超过等待时间, 也行但不精确
UTX0IF = 0; 若串口数据发送完成,标志位清零。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)