<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>USR---Dean and his friends</title>
	<atom:link href="http://www.usr.cc/go/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.usr.cc/go</link>
	<description>--奉献  分享 合作 自律</description>
	<lastBuildDate>Tue, 31 Aug 2010 10:35:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>【转】C#实现语音识别</title>
		<link>http://www.usr.cc/go/?p=212</link>
		<comments>http://www.usr.cc/go/?p=212#comments</comments>
		<pubDate>Tue, 31 Aug 2010 10:32:24 +0000</pubDate>
		<dc:creator>Dean Sinaean</dc:creator>
				<category><![CDATA[软件]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[TTS]]></category>
		<category><![CDATA[语音识别]]></category>

		<guid isPermaLink="false">http://www.usr.cc/go/?p=212</guid>
		<description><![CDATA[<br/>用语音识别最麻烦的就是训练计算机适应你的口音。但是，如果用模板匹配的方式基本上普通话基本标准就可以正常识别。模板匹配的另一个好处就是精心设计的语法文件使得程序不会识别出无效的命令。例如你希望用嘴巴控制四轴上升下降那么程序就应该对你说的“左转”没有反应。 1. 首先添加语音识别库的引用: 在代码里添加命名空间: using System.Speech.Recognition; 2. 无论操作系统是否系统启动语音识别程序，你都希望你的命令被你希望的程序而不是其他程序响应，例如你有一个命令叫“开始”，那么希望的结果是你的程序执行一个叫“开始”的过程而不是操作系统自动打开“开始菜单”。因此需要创建一个识别引擎的新实例而不是和系统共用一个。 创建一个System.Speech.Recognition.SpeechRecognitionEngine对象吧。 3. 来畅想下我们这个语音识别程序能做什么，简单点，我说“选择红色”那么窗体的背景就应该变红，“选择绿色”那么窗体的背景就应该变绿。恩，就这样，其他颜色视为无效命令程序无响应。 那么命令就是“选择（红色/绿色）”这样的结构，在这个句子中，“选择”是固定的，“红色”和“绿色”是可选择的，这几个词汇的组合就被称为语法，用System.Speech.Recognition.Grammar来表示。词汇的选择用System.Speech.Recognition.Choices来表示。 创建语法推荐用：System.Speech.Recognition.GrammarBuilder ========================================================= GB.Append(&#8220;选择&#8221;); GB.Append(new Choices(new string[] { &#8220;红色&#8221;, &#8220;绿色&#8221; })); Grammar G = new Grammar(GB); ========================================================= OK，上面的代码就创建了“选择（红色/绿色）”的语法。 在这条命令被识别后会触发System.Speech.Recognition.Grammar的SpeechRecognized事件。添加一个事件处理程序，在程序中处理这条命令吧（执行命令） using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Speech.Recognition; namespace 语音识别测试 { public partial class Form1 [...]]]></description>
			<content:encoded><![CDATA[<br/><p>用语音识别最麻烦的就是训练计算机适应你的口音。但是，如果用模板匹配的方式基本上普通话基本标准就可以正常识别。模板匹配的另一个好处就是精心设计的语法文件使得程序不会识别出无效的命令。例如你希望用嘴巴控制四轴上升下降那么程序就应该对你说的“左转”没有反应。<br />
1.<br />
首先添加语音识别库的引用:<br />
<img src="http://cache.ourdev.cn/bbs_upload482478/files_10/ourdev_303554.JPG" border="0" alt="" /><br />
在代码里添加命名空间:<br />
using System.Speech.Recognition;<br />
2.<br />
无论操作系统是否系统启动语音识别程序，你都希望你的命令被你希望的程序而不是其他程序响应，例如你有一个命令叫“开始”，那么希望的结果是你的程序执行一个叫“开始”的过程而不是操作系统自动打开“开始菜单”。因此需要创建一个识别引擎的新实例而不是和系统共用一个。<br />
创建一个System.Speech.Recognition.SpeechRecognitionEngine对象吧。<br />
3.<br />
来畅想下我们这个语音识别程序能做什么，简单点，我说“选择红色”那么窗体的背景就应该变红，“选择绿色”那么窗体的背景就应该变绿。恩，就这样，其他颜色视为无效命令程序无响应。<br />
那么命令就是“选择（红色/绿色）”这样的结构，在这个句子中，“选择”是固定的，“红色”和“绿色”是可选择的，这几个词汇的组合就被称为语法，用System.Speech.Recognition.Grammar来表示。词汇的选择用System.Speech.Recognition.Choices来表示。<br />
创建语法推荐用：System.Speech.Recognition.GrammarBuilder<br />
=========================================================<br />
GB.Append(&#8220;选择&#8221;);<br />
GB.Append(new Choices(new string[] { &#8220;红色&#8221;, &#8220;绿色&#8221; }));<br />
Grammar G = new Grammar(GB);<br />
=========================================================<br />
OK，上面的代码就创建了“选择（红色/绿色）”的语法。<br />
在这条命令被识别后会触发System.Speech.Recognition.Grammar的SpeechRecognized事件。添加一个事件处理程序，在程序中处理这条命令吧（执行命令）<br />
using System;<br />
using System.Collections.Generic;<br />
using System.ComponentModel;<br />
using System.Data;<br />
using System.Drawing;<br />
using System.Linq;<br />
using System.Text;<br />
using System.Windows.Forms;<br />
using System.Speech.Recognition;<br />
namespace 语音识别测试 {<br />
public partial class Form1 : Form {<br />
private SpeechRecognitionEngine SRE = new SpeechRecognitionEngine();<br />
public Form1() {<br />
InitializeComponent();<br />
}<br />
private void Form1_Load(object sender, EventArgs e) {<br />
SRE.SetInputToDefaultAudioDevice();???????? &lt;=======默认的语音输入设备，你可以设定为去识别一个WAV文件。<br />
GrammarBuilder GB = new GrammarBuilder();<br />
GB.Append(&#8220;选择&#8221;);<br />
GB.Append(new Choices(new string[] { &#8220;红色&#8221;, &#8220;绿色&#8221; }));<br />
Grammar G = new Grammar(GB);<br />
G.SpeechRecognized += new EventHandler&lt;SpeechRecognizedEventArgs&gt;(G_SpeechRecognized);<br />
SRE.LoadGrammar(G);<br />
SRE.RecognizeAsync(RecognizeMode.Multiple); &lt;=======异步调用识别引擎，允许多次识别（否则程序只响应你的一句话）<br />
}<br />
void G_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) {<br />
Text = e.Result.Text;<br />
switch (e.Result.Text) {<br />
case &#8220;选择红色&#8221;:<br />
BackColor = Color.Red;<br />
break;<br />
case &#8220;选择绿色&#8221;:<br />
BackColor = Color.Green;<br />
break;<br />
}<br />
}<br />
}<br />
}<br />
<img src="http://cache.ourdev.cn/bbs_upload482478/files_10/ourdev_303574.JPG" border="0" alt="" /><img src="http://cache.ourdev.cn/bbs_upload482478/files_10/ourdev_303575.JPG" border="0" alt="" /><br />
是不是很简单?当然语法文件可以复杂点，例如“设定[1/2/3/4]号电机输出[1%/2%/3%.........99%/100%]”</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://www.usr.cc/go/?p=156" rel="bookmark" class="crp_title">STM32的SDIO控制SD卡－－ 1</a></li><li><a href="http://www.usr.cc/go/?p=208" rel="bookmark" class="crp_title">C#实现简单的语音合成</a></li><li><a href="http://www.usr.cc/go/?p=100" rel="bookmark" class="crp_title">今天终于成功地把discuz!X1的发帖按钮给改了</a></li><li><a href="http://www.usr.cc/go/?p=96" rel="bookmark" class="crp_title">试试flickr manager</a></li><li><a href="http://www.usr.cc/go/?p=162" rel="bookmark" class="crp_title">SD卡的鉴定模式</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.usr.cc/go/?feed=rss2&amp;p=212</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C#实现简单的语音合成</title>
		<link>http://www.usr.cc/go/?p=208</link>
		<comments>http://www.usr.cc/go/?p=208#comments</comments>
		<pubDate>Tue, 31 Aug 2010 09:04:02 +0000</pubDate>
		<dc:creator>Dean Sinaean</dc:creator>
				<category><![CDATA[软件]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[TTS]]></category>
		<category><![CDATA[语音合成]]></category>

		<guid isPermaLink="false">http://www.usr.cc/go/?p=208</guid>
		<description><![CDATA[<br/>用C#实现语音合成是很容易的,这里指的只是语音合成系统的调用,而不是自己去做语音合成. 用C#实现调用系统API把一段文字用语音合成系统发出音来,需要一个插件,叫做DotNetSpeech.dll,一般来说你可能没有,网上搜吧,很多地方可以下载.把它放在一个文件夹内,并在这个文件夹内写一个cs源文件,内中代码如下: using System; using DotNetSpeech; class Hello { static void Main() { SpeechVoiceSpeakFlags spFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync; SpVoice voice = new SpVoice(); voice.Speak("hello,world!", spFlags); voice.WaitUntilDone(10000); } } 然后保存为a.cs,用csc.exe来编译,命令为csc /r:DotNetSpeech.dll a.cs? 这样就会在这个文件夹下生成一个a.exe文件,运行它就会调成TTS合成hello,world的发音.注意:确保你的电脑的确能发声,别告诉我不好用,结果是因为你没插音箱. 如果你的习惯使用VS来编程的,可能己经忘了怎么使用csc.exe.是这样用的:首先,你可以在你的.net framework安装目录下找到它.你可能安装了多个版本的.net framework,你只要用其中一个就行,我用的是2.0版的,它的目录是:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 把这个目录加入到环境变量Path中.就可以在命令行下用这个编译器了,当然你也可以不加,每次编译都把它的完整目录打出来. 怎么把它加入到环境变量里? 桌面-&#62;我的电脑(右键)-&#62;属性-&#62;高级-&#62;环境变量-&#62;系统变量-&#62;Path-&#62;编辑, 在其尾部追加分号+目录+分号,OK. Related Posts:SD卡的鉴定模式STM32的SDIO控制SD卡－－ 1【转】C#实现语音识别今天终于成功地把discuz!X1的发帖按钮给改了试试flickr manager]]></description>
			<content:encoded><![CDATA[<br/><p>用C#实现语音合成是很容易的,这里指的只是语音合成系统的调用,而不是自己去做语音合成.</p>
<p>用C#实现调用系统API把一段文字用语音合成系统发出音来,需要一个插件,叫做DotNetSpeech.dll,一般来说你可能没有,网上搜吧,很多地方可以下载.把它放在一个文件夹内,并在这个文件夹内写一个cs源文件,内中代码如下:</p>
<pre><span style="color: #0000ff;">using</span> System;
<span style="color: #0000ff;">using</span> DotNetSpeech;
<span style="color: #0000ff;">class</span> Hello
{
	<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Main()
	{
		SpeechVoiceSpeakFlags spFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
		SpVoice voice = <span style="color: #0000ff;">new</span> SpVoice();
		voice.Speak("<span style="color: #8b0000;">hello,world!</span>", spFlags);
		voice.WaitUntilDone(10000);
	}
}</pre>
<p>然后保存为a.cs,用csc.exe来编译,命令为csc /r:DotNetSpeech.dll a.cs? 这样就会在这个文件夹下生成一个a.exe文件,运行它就会调成TTS合成hello,world的发音.注意:确保你的电脑的确能发声,别告诉我不好用,结果是因为你没插音箱.</p>
<p>如果你的习惯使用VS来编程的,可能己经忘了怎么使用csc.exe.是这样用的:首先,你可以在你的.net framework安装目录下找到它.你可能安装了多个版本的.net framework,你只要用其中一个就行,我用的是2.0版的,它的目录是:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 把这个目录加入到环境变量Path中.就可以在命令行下用这个编译器了,当然你也可以不加,每次编译都把它的完整目录打出来.</p>
<p>怎么把它加入到环境变量里?</p>
<p>桌面-&gt;我的电脑(右键)-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统变量-&gt;Path-&gt;编辑, 在其尾部追加分号+目录+分号,OK.</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://www.usr.cc/go/?p=162" rel="bookmark" class="crp_title">SD卡的鉴定模式</a></li><li><a href="http://www.usr.cc/go/?p=156" rel="bookmark" class="crp_title">STM32的SDIO控制SD卡－－ 1</a></li><li><a href="http://www.usr.cc/go/?p=212" rel="bookmark" class="crp_title">【转】C#实现语音识别</a></li><li><a href="http://www.usr.cc/go/?p=100" rel="bookmark" class="crp_title">今天终于成功地把discuz!X1的发帖按钮给改了</a></li><li><a href="http://www.usr.cc/go/?p=96" rel="bookmark" class="crp_title">试试flickr manager</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.usr.cc/go/?feed=rss2&amp;p=208</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ubuntu10.04误改分辨率后无法进图形界面为彩条的解决方法</title>
		<link>http://www.usr.cc/go/?p=159</link>
		<comments>http://www.usr.cc/go/?p=159#comments</comments>
		<pubDate>Wed, 25 Aug 2010 11:22:31 +0000</pubDate>
		<dc:creator>Dean Sinaean</dc:creator>
				<category><![CDATA[硬件]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[分辨率]]></category>

		<guid isPermaLink="false">http://www.usr.cc/go/?p=159</guid>
		<description><![CDATA[<br/>由于误改了ubuntu的分辨率，再进ubuntu时全是彩条，不能正常显示。网上搜了好久也没找到全适的解决办法。 最终自己摸索出一个办法。 首先，网上讲的xorg.conf文件的方法是行不通的。因为10.04版没有那个文件。 还有一个用xrandr命令的，不过也没好用。 用rescue模式进入后不知为什么改不了分辨率。 最后我是这样弄好的： 正常启动ubuntu,登陆界面显示是正常的，只不过登录后会显示混乱。 在登陆界面，点击你的用户名，然后在输入密码登陆前，看屏的最下面右侧，可以设置登陆目标，默认是gnome,但是下拉菜单里有一个xsterm，这个是一个图形化的终端。好，你们登陆到这个终端，这会在登陆界面打开一个终端，在这里我们可以运行程序，只要我们运行到分辨率的配置程序就可以了，呵呵，试了一会儿我就找到了。为：gnome-display-properties,运行这个程序，就可以打开一个ubuntu下修改分辨率的奇丑无比版图形程序，与你平时用的结构是一样的，在这里重新修改后exit,然后登陆到gnome就可以了。 Hope this will be helpful to someone (including future me)! No related posts found]]></description>
			<content:encoded><![CDATA[<br/><p>由于误改了ubuntu的分辨率，再进ubuntu时全是彩条，不能正常显示。网上搜了好久也没找到全适的解决办法。</p>
<p>最终自己摸索出一个办法。</p>
<p>首先，网上讲的xorg.conf文件的方法是行不通的。因为10.04版没有那个文件。</p>
<p>还有一个用xrandr命令的，不过也没好用。</p>
<p>用rescue模式进入后不知为什么改不了分辨率。</p>
<p>最后我是这样弄好的：</p>
<p>正常启动ubuntu,登陆界面显示是正常的，只不过登录后会显示混乱。</p>
<p>在登陆界面，点击你的用户名，然后在输入密码登陆前，看屏的最下面右侧，可以设置登陆目标，默认是gnome,但是下拉菜单里有一个xsterm，这个是一个图形化的终端。好，你们登陆到这个终端，这会在登陆界面打开一个终端，在这里我们可以运行程序，只要我们运行到分辨率的配置程序就可以了，呵呵，试了一会儿我就找到了。为：gnome-display-properties,运行这个程序，就可以打开一个ubuntu下修改分辨率的奇丑无比版图形程序，与你平时用的结构是一样的，在这里重新修改后exit,然后登陆到gnome就可以了。</p>
<p>Hope this will be helpful to someone (including future me)!</p>
<div id="crp_related"><p>No related posts found</p></div>]]></content:encoded>
			<wfw:commentRss>http://www.usr.cc/go/?feed=rss2&amp;p=159</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SD卡的鉴定模式</title>
		<link>http://www.usr.cc/go/?p=162</link>
		<comments>http://www.usr.cc/go/?p=162#comments</comments>
		<pubDate>Wed, 25 Aug 2010 11:22:24 +0000</pubDate>
		<dc:creator>Dean Sinaean</dc:creator>
				<category><![CDATA[硬件]]></category>
		<category><![CDATA[sdio]]></category>
		<category><![CDATA[sd卡]]></category>

		<guid isPermaLink="false">http://www.usr.cc/go/?p=162</guid>
		<description><![CDATA[<br/>SD卡使用中要经历两种模式,第一个是SD卡鉴定模式,另一个是卡读写模式. 在第一种模式中,主机获得卡的类型、操作电压范围等信息，判断主机与卡能否进行正常的通信。并为卡设定一个相对的地址，以在读写时区分不同的卡。 这个过程（卡鉴定）分为两个阶段：卡复位和卡鉴定 一、卡复位 SD卡复位有两种方法： CMD0（GO_IDLE_STATE),对MMC 、SD卡有效. CMD52(IO_RW_DIRECT), 对SDIO卡有效. 二、明确卡操作电压范围 （卡的可操作电压范围存于卡的OCR寄存器,即Operation Conditions Register) 主机发送主机的电压范围窗(命令的参数里面),卡自我验证,不符合这一范围的退出. 主机不发送电压范围窗(参数为空),卡应答自己的电压范围,交互式确定最终使用哪一个范围,不在此范围的退出. 验证电压范围的命令: CMD1: (SEND_OP_COND) ACMD41: (SEND_APP_OP_COND) 对SD卡有效. CMD5: (IO_SEND_OP_COND) 对SDIO卡有效. 卡签定码(CID)和卡针对性数据存于payload memory. 卡签定的过程 (MMC与SD卡有不同): 一、 MMC卡 ? 开始于时钟频率Fod. SDIO_CMD open drain 允许多卡并行操作 MMC卡的鉴定步骤: 1. 激法总线 2. 广播CMD1 (SEND_OP_COND) 应答为各卡的操作条件寄存器(OCR)的线与. 不兼容的卡自动退出 3. 广播CMD2 (ALL_SEND_CID) 所有的卡都发出自己的CID,在总线上仲裁,最终只有一个卡可以完整地发完自己的CID. 4. 寻址发送CMD3(SET_RELATIVE_ADDR) 得到自己的相对地址的卡进入standby mode,然后不响应以后的卡鉴定命令.并且其输出改变为推挽方式(Push-Pull). 5. 重复3~4,直到超时. 二、 [...]]]></description>
			<content:encoded><![CDATA[<br/><p><span style="color: #008040;">SD卡使用中要经历两种模式,第一个是SD卡鉴定模式,另一个是卡读写模式.</span></p>
<p>在第一种模式中,主机获得卡的类型、操作电压范围等信息，判断主机与卡能否进行正常的通信。并为卡设定一个相对的地址，以在读写时区分不同的卡。</p>
<p><span style="color: #408080;">这个过程（卡鉴定）分为两个阶段：卡复位和卡鉴定</span></p>
<p><span style="color: #000000;">一、卡复位</span></p>
<p><span style="color: #000000;">SD卡复位有两种方法：</span></p>
<ol>
<li><span style="color: #000000;">         CMD0（GO_IDLE_STATE),对MMC 、SD卡有效.</span></li>
<li><span style="color: #000000;">        CMD52(IO_RW_DIRECT), 对SDIO卡有效.</span></li>
</ol>
<p><span style="color: #000000;">二、明确卡操作电压范围 （卡的可操作电压范围存于卡的OCR寄存器,即Operation Conditions Register)</span></p>
<ol>
<li><span style="color: #000000;">        主机发送主机的电压范围窗(命令的参数里面),卡自我验证,不符合这一范围的退出.</span></li>
<li><span style="color: #000000;">        主机不发送电压范围窗(参数为空),卡应答自己的电压范围,交互式确定最终使用哪一个范围,不在此范围的退出.</span></li>
<li><span style="color: #000000;">        验证电压范围的命令:</span>
<ol>
<li><span style="color: #000000;">CMD1:         (SEND_OP_COND)</span></li>
<li><span style="color: #000000;">ACMD41:        (SEND_APP_OP_COND)   对SD卡有效.</span></li>
<li><span style="color: #000000;">CMD5:        (IO_SEND_OP_COND)     对SDIO卡有效.</span></li>
</ol>
</li>
<li><span style="color: #000000;">        卡签定码(CID)和卡针对性数据存于payload memory.</span></li>
</ol>
<p><span style="color: #408080;">卡签定的过程 (MMC与SD卡有不同):</span></p>
<p>一、 MMC卡</p>
<ol>
<li>?
<ol>
<li>开始于时钟频率Fod.</li>
<li>SDIO_CMD open drain</li>
<li>允许多卡并行操作</li>
</ol>
</li>
</ol>
<p>MMC卡的鉴定步骤:</p>
<p>        1.        激法总线</p>
<p>        2.        广播CMD1 (SEND_OP_COND)</p>
<blockquote><p>        应答为各卡的操作条件寄存器(OCR)的线与.</p>
<p>        不兼容的卡自动退出</p></blockquote>
<p>        3.        广播CMD2 (ALL_SEND_CID)</p>
<p><span>所有的卡都发出自己的CID,在总线上仲裁,最终只有一个卡可以完整地发完自己的CID.</span></p>
<p>        4.        寻址发送CMD3(SET_RELATIVE_ADDR)</p>
<p>得到自己的相对地址的卡进入standby mode,然后不响应以后的卡鉴定命令.并且其输出改变为推挽方式(Push-Pull).</p>
<p>        5.        重复3~4,直到超时.</p>
<p>二、 SD卡</p>
<blockquote><p><span>SD卡与MMC不同,初始卡的输出即为推挽方式.</span></p></blockquote>
<p>SD卡的鉴定步骤:</p>
<ol>
<li>        激活总线</li>
<li>        广播ACMD41 (SD_APP_OP_COND)</li>
<li>        广播CMD2 (ALL_SEND_CID)</li>
<li>        寻址发送CMD3(SET_RELATIVE_ADDR).</li>
</ol>
<p>三、 SDIO卡</p>
<ol>
<li>        激活总线</li>
<li>        广播CMD5 (IO_SEND_OP_COND)</li>
<li>        寻址CMD3 (SET_RELATIVE_ADDR)</li>
</ol>
<p>以上是stm32手册中讲的大意,但是实际应用中似乎不是这么用的.看了一些代码,里面用的都是cmd8 cmd55等等.</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://www.usr.cc/go/?p=208" rel="bookmark" class="crp_title">C#实现简单的语音合成</a></li><li><a href="http://www.usr.cc/go/?p=156" rel="bookmark" class="crp_title">STM32的SDIO控制SD卡－－ 1</a></li><li><a href="http://www.usr.cc/go/?p=212" rel="bookmark" class="crp_title">【转】C#实现语音识别</a></li><li><a href="http://www.usr.cc/go/?p=96" rel="bookmark" class="crp_title">试试flickr manager</a></li><li><a href="http://www.usr.cc/go/?p=100" rel="bookmark" class="crp_title">今天终于成功地把discuz!X1的发帖按钮给改了</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.usr.cc/go/?feed=rss2&amp;p=162</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>STM32的SDIO控制SD卡－－ 1</title>
		<link>http://www.usr.cc/go/?p=156</link>
		<comments>http://www.usr.cc/go/?p=156#comments</comments>
		<pubDate>Sun, 01 Aug 2010 13:39:01 +0000</pubDate>
		<dc:creator>Dean Sinaean</dc:creator>
				<category><![CDATA[硬件]]></category>
		<category><![CDATA[sdio]]></category>
		<category><![CDATA[sd卡]]></category>
		<category><![CDATA[stm32]]></category>

		<guid isPermaLink="false">http://www.usr.cc/go/?p=156</guid>
		<description><![CDATA[<br/>注：本文选自论坛：http://www.usr.cc/thread-2103-1-1.html 一、STM32的SDIO适配器的结构 STM32的SDIO适配器包括与AHB总线接口和SD卡接口两个大块儿。如下面图中两个灰色阴影区域。 左侧的阴影部分又细分两个子单无，适配器寄存器组和FIFO。适配器寄存器组包含了所有SDIO所有的寄存器，这些寄存器用于配置一些参数，以实现一些SD协议中的时序，最终于实现SD卡的命令传输。FIFO则是为了实现数据的传输，这两者部分分别代表者对SD卡的两种传输操作，即命令的传输和数据的传输。 右侧的阴影部分，即SDIO适配器的SD卡接口大块儿，又细分为三个子单元。控制单元（Control Unit)，命令通道和数据通道（Command Path and Data Path).控制单元主要实现电源和时钟的控制。它根据适配器寄存器组中寄存器的配置，开启和关闭SDIO适配器模块的电源，改变工作的时钟源（直接使用SDIO＿CLK还是其分频后的时钟等）。命令通道连接CMD线，控制命令的传输。数据通道连接数据线（DAT0～DAT7），控制数据的传输。 二、分单元详述 下面按照上面一章提到的五个子单元的划分，对各子单元进行详细的描述。 1、适配器寄存器组 The adapter register block contains all system registers. This block also generates the signals that clear the static flags in the multimedia card. The clear signals are generated when 1 is written into the corresponding bit location in the SDIO Clear register. [...]]]></description>
			<content:encoded><![CDATA[<br/><p>注：本文选自论坛：<a href="http://www.usr.cc/thread-2103-1-1.html">http://www.usr.cc/thread-2103-1-1.html</a></p>
<p>一、STM32的SDIO适配器的结构<br />
STM32的SDIO适配器包括<strong><span style="color: #ff0000;">与AHB总线接口</span></strong>和<span style="color: #ff0000;"><strong>SD卡接口</strong></span>两个大块儿。如下面图中两个灰色阴影区域。<br />
左侧的阴影部分又细分两个子单无，适<strong><span style="color: #ff0000;">配器寄存器组</span></strong>和<strong><span style="color: #ff0000;">FIFO</span></strong>。适配器寄存器组包含了所有SDIO所有的寄存器，这些寄存器用于配置一些参数，以实现一些SD协议中的时序，最终于实现SD卡的命令传输。FIFO则是为了实现数据的传输，这两者部分分别代表者对SD卡的两种传输操作，即命令的传输和数据的传输。<br />
右侧的阴影部分，即SDIO适配器的SD卡接口大块儿，又细分为三个子单元。<strong><span style="color: #ff0000;">控制单元（Control Unit)</span></strong>，<strong><span style="color: #ff0000;">命令通道</span></strong>和<strong><span style="color: #ff0000;">数据通道</span></strong>（Command Path and Data Path).控制单元主要实现电源和时钟的控制。它根据适配器寄存器组中寄存器的配置，开启和关闭SDIO适配器模块的电源，改变工作的时钟源（直接使用SDIO＿CLK还是其分频后的时钟等）。命令通道连接CMD线，控制命令的传输。数据通道连接数据线（DAT0～DAT7），控制数据的传输。</p>
<p style="text-align: center;"><img class="aligncenter" src="http://lh5.ggpht.com/_1mOSPNn3fEc/TFJHKmHAstI/AAAAAAAAAEQ/rQVg5uduU-Y/QQ%E6%88%AA%E5%9B%BE%E6%9C%AA%E5%91%BD%E5%90%8D.jpg" border="0" alt="" width="595" height="330" /></p>
<p>二、分单元详述</p>
<p>下面按照上面一章提到的五个子单元的划分，对各子单元进行详细的描述。<br />
<strong><span style="color: #ff0000;">1、适配器寄存器组</span></strong><br />
The adapter register block contains all system registers. This block also generates the signals that clear the static flags in the multimedia card. The clear signals are generated when 1 is written into the corresponding bit location in the SDIO Clear register.</p>
<p>这个STM32数据手册上关于这一部分的全部描述，大体上就是说：适配器寄存器组包含了所有的系统寄存器。它还产生用于清除MMC卡的静态标志位的信号。当向SDIO Clear register(清除寄存器）的对应位写1，即产生这个信号。<br />
<strong><span style="color: #ff0000;">2、控制单元</span></strong><br />
这一单元又在内部分为电源管理和时钟管理两个子单元，他们都受控制适配器寄存器组。时钟管理子单元产生和控制时钟信号SDIO＿CK，也就是SD卡最络接收到的SCK。时钟管理子单元工作于两种模式时钟分频模式和时钟直通模式（Bypass,标准的翻译不知是什么，似乎可以是“旁路”，但“直通”更容易理解些）。当工作在直通模式进，SDIO_CK==SDIO_CLK.工作于分频模块时，SDIO_CK==SDIO_CLK/div.<br />
在如下情形下，时钟是不输出时钟信号的：</p>
<ul type="1">
<li>复位后</li>
<li>上电和掉电期间</li>
<li>省电模式下总线处于空闲模式时</li>
</ul>
<p>电源管理子单元在上电和掉电时关继时适配器的输出信号。</p>
<p style="text-align: center;"><img class="aligncenter" src="http://lh6.ggpht.com/_1mOSPNn3fEc/TFJH3zuYQXI/AAAAAAAAAEs/1L7-xiuoyVs/QQ%E6%88%AA%E5%9B%BE%E6%9C%AA%E5%91%BD%E5%90%8D.jpg" border="0" alt="" width="541" height="251" /></p>
<p><strong><span style="color: #ff0000;">3、命令通道</span></strong><br />
命令通道向卡发送命令和接收回应。</p>
<p style="text-align: center;"><img class="aligncenter" src="http://lh5.ggpht.com/_1mOSPNn3fEc/TFJI81VPB1I/AAAAAAAAAFA/TdeW9QxTxE8/QQ%E6%88%AA%E5%9B%BE%E6%9C%AA%E5%91%BD%E5%90%8D.jpg" border="0" alt="" width="511" height="344" /></p>
<p>如图所示，图上左侧阴影部分是属于适配器寄存器组子单元里的两个寄存器，分别为SDIO_ARG和SDIO_CMD,后者用于添加想要发送的命令，前者用于添加所要发送的命令的参数，将两个添好之后使能命令发送，命令就会自动发送出去。适配器上述两个寄存器的内容进行组合，并最终形成48位长的命令，这48位首先进入移位寄存器，即图中的Shift register,在这里由并转串一位一位的发送，由图可见，这些位要经过CRC后，才发送出去。实际上，前面讲的总位数并非48，在这里经过CRC，生成那些位的CRC较验值，并追加到其尾部，最络才是48位。命令分为有回应的和没有回应的两种。如果发送的是没有回应的命令，发送之后会对标志位中的相送位置位，通知系统，命令发送正常，然后进入空闭状态。如果发送的命令是有回应的命令，则要等待回应。接收到回应之后，会对回应进行CRC校验，并设定相关位。下面是<span style="color: #ff0000;"><strong>命令通道的状态机：</strong></span></p>
<p style="text-align: center;"><img class="aligncenter" src="http://lh6.ggpht.com/_1mOSPNn3fEc/TFJP7O67-hI/AAAAAAAAAFU/axVH4xpQ-Z0/s512/QQ%E6%88%AA%E5%9B%BE%E6%9C%AA%E5%91%BD%E5%90%8D.jpg" border="0" alt="" width="512" height="401" /></p>
<p>进入等待状态后，命令时钟（command timer)开始计时，如果到达超时时间CPSM状态机还没移动到接收状态，则置位超时标志并进入空闲状态。</p>
<p><span style="color: #ff0000;">注意</span>：命令超时时间是固定值，为64个SDIO_CK。<br />
如果在命令寄存器中设置了中断位（interrupt bit),就不会启用上面讲到的超时时钟，CPSM状态机会一直等待来自卡的中断请求。如果在命令寄存器中置位了悬停位（pending bit)，CPSM状态机会进入悬停状态（所谓的挂起状态），并等待来自数据通道子单元的CmdPend信号。检测到CmdPend位以为，CPSM状态机会移动到发送状态（Send state),这将使数据计数器停止命令的传输。<br />
<span style="color: #ff0000;">注意</span>：CPSM会在空闲模式停留至少8个SDIO＿CK时间，以满足Ncc和Nrc的时间要求。Ncc时两次主机命令传输的最小延迟，而Nrc时主机命令与卡的回应之间的最小延迟。如下图：</p>
<p style="text-align: center;"><img class="aligncenter" src="http://lh4.ggpht.com/_1mOSPNn3fEc/TFJStpwrdfI/AAAAAAAAAFo/LEO-lFXZ-_U/s512/QQ%E6%88%AA%E5%9B%BE%E6%9C%AA%E5%91%BD%E5%90%8D.jpg" border="0" alt="" width="512" height="126" /></p>
<p><span style="color: #ff0000;"><strong>命令的格式：</strong></span><br />
<strong>命令即是开始传输的一个标记。命令由主机发送给单个卡（寻址性命令）或是所有的卡（广播性命令，MMC V3.31及更早的MMC卡标准中支持）。命令通过CMD信号线串行传输，所有的命令都有一个固定的长度，即48位。命令的格式如下图：<br />
</strong></p>
<p style="text-align: center;"><span style="color: #ff0000;"><strong><span style="color: #000000;"><img class="aligncenter" src="http://lh3.ggpht.com/_1mOSPNn3fEc/TFJv1Yp7jGI/AAAAAAAAAF4/ZqeD8bzzptc/s512/QQ%E6%88%AA%E5%9B%BE%E6%9C%AA%E5%91%BD%E5%90%8D.jpg" border="0" alt="" width="512" height="188" /></span></strong></span></p>
<p><strong>命令通道工作于半双工模式，所以可以发送，也可以接收命令或回应。如果CPSM状态机不在发送状态（Send State),SDIO＿CMD为高阻状态（Hi-Z state)，如下图：<br />
</strong></p>
<p style="text-align: center;"><span style="color: #ff0000;"><strong><span style="color: #000000;"><img class="aligncenter" src="http://lh4.ggpht.com/_1mOSPNn3fEc/TFJStpwrdfI/AAAAAAAAAFo/LEO-lFXZ-_U/s512/QQ%E6%88%AA%E5%9B%BE%E6%9C%AA%E5%91%BD%E5%90%8D.jpg" border="0" alt="" width="512" height="126" /></span></strong></span></p>
<p>SDIO_CMD在SDIO_CK的上升沿进行同步。<br />
<strong><span style="color: #ff0000;">回应：</span></strong><br />
回应是由被寻址的卡发出的一个标记（或是在MMC V3.31及以前标准中，所有连接在适配器上的卡同步发送），此标记由卡发给主机，是对刚刚接收到的命令的回答。回应是在CMD信号线上串行传输的。<br />
SDIO支持两种回应类型，都是进行CRC校验的：</p>
<ul>
<li>48位的短回应(short response)</li>
<li>136位的长回应（long response)</li>
</ul>
<p><span style="color: #ff0000;">注意</span>：如果回应不包含CRC校验信息（如CMD1的回应），设备驱动就必须忽略CRC错误的状态。<br />
下面两张表是两种回应的格式：</p>
<p style="text-align: center;"><img class="aligncenter" src="http://lh4.ggpht.com/_1mOSPNn3fEc/TFJwtq6DaaI/AAAAAAAAAGI/OGx61QjO3l8/s512/QQ%E6%88%AA%E5%9B%BE%E6%9C%AA%E5%91%BD%E5%90%8D.jpg" border="0" alt="" width="512" height="351" /></p>
<p>前面讲到，SDIO适配器包含两个大块儿，详见本帖开头，这里只拿出图来：</p>
<p style="text-align: center;"><span style="color: #ff0000;"><strong><span style="color: #000000;"><img class="aligncenter" src="http://lh5.ggpht.com/_1mOSPNn3fEc/TFJHKmHAstI/AAAAAAAAAEQ/rQVg5uduU-Y/QQ%E6%88%AA%E5%9B%BE%E6%9C%AA%E5%91%BD%E5%90%8D.jpg" border="0" alt="" width="595" height="330" /><br />
</span></strong></span></p>
<p><span style="color: #ff0000;"><strong><span style="color: #000000;"><span style="font-weight: normal;">其中，与AHB接口相连的有两个块儿，就是上图中左侧阴影部分，Adapter registers 和FIFO,即适配器寄存器组和数据FIFO。前者包含了适配器所有的寄存器，用于配置相应时序，产生相应的信号。</span></span></strong></span></p>
<p><strong>这里面，用于控制命令通道产生命令时序的就有两个寄存器，名为SDIO_ARG和SDIO_CMD，SDIO_ARG的三十二位全部用来存储命令参数，也就没什么好讲的了。SDIO_CMD则不同，它有六个位，用来识别不同的命令，总共可以区别64个，但实际上SD卡的命令集没有那么多。SDIO_CMD还有一些位，用来表示些命令时否有回应，是长回应还是短回应，命令的类型是什么等等。适配器最终根据这些，加上CRC组合成一个48位的命令。</strong></p>
<p><strong>另外，我们还提到过命令发送之后，如果这是一个没有回应的命令，那么就很简单，命令通道直接置位CMDSENT标志，或进入空闲状态。如果是有回应的，则要等待回应，并设定相关的标志位。命令通道的相关标志位如下：</p>
<p style="text-align: center;"><strong><span style="color: #000000;"><img class="aligncenter" src="http://lh6.ggpht.com/_1mOSPNn3fEc/TFVz_RxzBjI/AAAAAAAAAHg/52femsb8BhU/s640/sendpix1.jpg" border="0" alt="" width="600" height="175" /></span></strong></p>
<p><span style="font-weight: normal;">CRC产生器计算的是CRC码前面的所有位的校验和。这包括开始位，传输位，命令索引（command index)和命令参数（和卡状态）。对长回应格式来说，CRC校验和计算的是CID或CSD的前120位。这里不包括开始位，传输位和六个保留位。CRC是一个7位的值，其计算方法如下：</span></p>
<p></strong></p>
<p><strong><strong><span style="color: #000000;"><img src="http://lh3.ggpht.com/_1mOSPNn3fEc/TFV3Yk0vqNI/AAAAAAAAAHo/qongdSY-17s/sendpix0.jpg" border="0" alt="" width="454" height="135" /></span></strong><br />
</strong>好了，这个帖子己经有点儿长了，而且时间也差不多了。今天先结帖，有时间再接着写第二篇。</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://www.usr.cc/go/?p=162" rel="bookmark" class="crp_title">SD卡的鉴定模式</a></li><li><a href="http://www.usr.cc/go/?p=208" rel="bookmark" class="crp_title">C#实现简单的语音合成</a></li><li><a href="http://www.usr.cc/go/?p=100" rel="bookmark" class="crp_title">今天终于成功地把discuz!X1的发帖按钮给改了</a></li><li><a href="http://www.usr.cc/go/?p=212" rel="bookmark" class="crp_title">【转】C#实现语音识别</a></li><li><a href="http://www.usr.cc/go/?p=96" rel="bookmark" class="crp_title">试试flickr manager</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.usr.cc/go/?feed=rss2&amp;p=156</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>机电09级己上交全部作业同学名单</title>
		<link>http://www.usr.cc/go/?p=138</link>
		<comments>http://www.usr.cc/go/?p=138#comments</comments>
		<pubDate>Sun, 11 Jul 2010 03:37:18 +0000</pubDate>
		<dc:creator>Dean Sinaean</dc:creator>
				<category><![CDATA[声明]]></category>

		<guid isPermaLink="false">http://www.usr.cc/go/?p=138</guid>
		<description><![CDATA[<br/>点下里下载EXEL文件(09级交作来名单):新建 WPS表格 工作簿 Related Posts:lcd1602的读写时序详细解读试试flickr manager今天终于成功地把discuz!X1的发帖按钮给改了STM32的SDIO控制SD卡－－ 1STM32的SysTick完全解读(整理)]]></description>
			<content:encoded><![CDATA[<br/><p><a href="http://www.usr.cc/go/wp-content/uploads/2010/07/新建-WPS表格-工作簿.xls">点下里下载EXEL文件(09级交作来名单):新建 WPS表格 工作簿</a></p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://www.usr.cc/go/?p=75" rel="bookmark" class="crp_title">lcd1602的读写时序详细解读</a></li><li><a href="http://www.usr.cc/go/?p=96" rel="bookmark" class="crp_title">试试flickr manager</a></li><li><a href="http://www.usr.cc/go/?p=100" rel="bookmark" class="crp_title">今天终于成功地把discuz!X1的发帖按钮给改了</a></li><li><a href="http://www.usr.cc/go/?p=156" rel="bookmark" class="crp_title">STM32的SDIO控制SD卡－－ 1</a></li><li><a href="http://www.usr.cc/go/?p=116" rel="bookmark" class="crp_title">STM32的SysTick完全解读(整理)</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.usr.cc/go/?feed=rss2&amp;p=138</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>金山快盘使用体验</title>
		<link>http://www.usr.cc/go/?p=130</link>
		<comments>http://www.usr.cc/go/?p=130#comments</comments>
		<pubDate>Fri, 09 Jul 2010 07:02:09 +0000</pubDate>
		<dc:creator>Dean Sinaean</dc:creator>
				<category><![CDATA[软件]]></category>
		<category><![CDATA[金山]]></category>
		<category><![CDATA[快盘]]></category>

		<guid isPermaLink="false">http://www.usr.cc/go/?p=130</guid>
		<description><![CDATA[<br/>前几天注册了金山快盘,今天终于得到了账号,忙不急得将早就下载安装好了,并不时提醒我还没有绑定账号的快盘软件打开,将新得到的账号填上. 原来首次注册得到的空间的确是1G,这时在是小了点,U盘也比这大了.但这个有一个优点,就是可以团队间互相分享文件. 首先说一下快盘在机器上的单独盘符的实现,还是有图有真象吧. Related Posts:试试flickr manager今天终于成功地把discuz!X1的发帖按钮给改了STM32的SysTick完全解读(整理)STM32的SDIO控制SD卡－－ 1lcd1602的读写时序详细解读]]></description>
			<content:encoded><![CDATA[<br/><p>前几天注册了金山快盘,今天终于得到了账号,忙不急得将早就下载安装好了,并不时提醒我还没有绑定账号的快盘软件打开,将新得到的账号填上.</p>
<p>原来首次注册得到的空间的确是1G,这时在是小了点,U盘也比这大了.但这个有一个优点,就是可以团队间互相分享文件.</p>
<p>首先说一下快盘在机器上的单独盘符的实现,还是有图有真象吧.<br />
<img src="http://76.13.18.79/4114/4776721542_de1cdb0fff_z.jpg" width="640" height="479" alt="金山快盘"></img></p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://www.usr.cc/go/?p=96" rel="bookmark" class="crp_title">试试flickr manager</a></li><li><a href="http://www.usr.cc/go/?p=100" rel="bookmark" class="crp_title">今天终于成功地把discuz!X1的发帖按钮给改了</a></li><li><a href="http://www.usr.cc/go/?p=116" rel="bookmark" class="crp_title">STM32的SysTick完全解读(整理)</a></li><li><a href="http://www.usr.cc/go/?p=156" rel="bookmark" class="crp_title">STM32的SDIO控制SD卡－－ 1</a></li><li><a href="http://www.usr.cc/go/?p=75" rel="bookmark" class="crp_title">lcd1602的读写时序详细解读</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.usr.cc/go/?feed=rss2&amp;p=130</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>桌面Linux排名：Ubuntu第一SUSE第二</title>
		<link>http://www.usr.cc/go/?p=108</link>
		<comments>http://www.usr.cc/go/?p=108#comments</comments>
		<pubDate>Fri, 09 Jul 2010 01:56:28 +0000</pubDate>
		<dc:creator>Dean Sinaean</dc:creator>
				<category><![CDATA[声明]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[SUSE]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[排名]]></category>

		<guid isPermaLink="false">http://www.usr.cc/go/?p=108</guid>
		<description><![CDATA[<br/>据DesktopLinux.com日前公布的调查报告显示，在过去的一年中，Linux在桌面市场的用户数量翻了一番。　　 报告显示，Ubuntu是最受欢迎的Linux版本，用户的选择比例高达30%。当然，这里所说的Ubuntu版还包括其姊妹版本Kubuntu、 Xubuntu和Edubuntu。 此外，SUSE所占比例为21%，位居第二；其他Debian版本占14%，排名第三；Fedora/红帽位居第四，所占比例为9%；Gentoo比例为 7%，排名第五。而其他Linux版本所占比例为18%。 报告还显示，Firefox是Linux用户使用最多的Web浏览器，所占比例高达60%。Konqueror位居第二，比例为14%；Opera排名第三，比例为12%；而其他浏览器占14%。 至于电子邮件客户端， Thunderbird是Linux用户首选，比例为37%；Evolution排名第二，所占比例为32%；Kmail第三，比例为17%；而其他占 14%。 No related posts found]]></description>
			<content:encoded><![CDATA[<br/><p>据DesktopLinux.com日前公布的调查报告显示，在过去的一年中，Linux在桌面市场的用户数量翻了一番。　　<br />
报告显示，Ubuntu是最受欢迎的Linux版本，用户的选择比例高达30%。当然，这里所说的Ubuntu版还包括其姊妹版本Kubuntu、 Xubuntu和Edubuntu。<br />
此外，SUSE所占比例为21%，位居第二；其他Debian版本占14%，排名第三；Fedora/红帽位居第四，所占比例为9%；Gentoo比例为 7%，排名第五。而其他Linux版本所占比例为18%。<br />
报告还显示，Firefox是Linux用户使用最多的Web浏览器，所占比例高达60%。Konqueror位居第二，比例为14%；Opera排名第三，比例为12%；而其他浏览器占14%。<br />
至于电子邮件客户端， Thunderbird是Linux用户首选，比例为37%；Evolution排名第二，所占比例为32%；Kmail第三，比例为17%；而其他占 14%。</p>
<div id="crp_related"><p>No related posts found</p></div>]]></content:encoded>
			<wfw:commentRss>http://www.usr.cc/go/?feed=rss2&amp;p=108</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>STM32的SysTick完全解读(整理)</title>
		<link>http://www.usr.cc/go/?p=116</link>
		<comments>http://www.usr.cc/go/?p=116#comments</comments>
		<pubDate>Wed, 07 Jul 2010 12:14:17 +0000</pubDate>
		<dc:creator>Dean Sinaean</dc:creator>
				<category><![CDATA[硬件]]></category>
		<category><![CDATA[stm32]]></category>
		<category><![CDATA[systick]]></category>

		<guid isPermaLink="false">http://www.usr.cc/go/?p=116</guid>
		<description><![CDATA[<br/>Note:本文意在完整地解读STM32的定时器,为在本文水平有限的前提下达成此目地,本文中参考了很多其他网友的文字,若有不当之处,敬请指正. Q：为何要使用SysTick定时器? 大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,这个滴答中断将用作系统时间片轮转的参考时间，用以实现任务的正常调度. 因此，需要一个定时器来产生周期性的中断，而且最好还让用户程序不能随意访问它的寄存器，以维持操作系统“心跳”的节律。 当然,如果不用操作系统的话,这个定时器也可以用做其他用途,如闹铃等. Q: SysTick有何不同,为什么非这个也不用普通的? STM32的SysTick属于其16个不可屏蔽中断之一（占有不可屏蔽中断向量位置）.不同于一般的中断. Q：Systick如何运行？ SysTick具有四专门的管理寄存器： SysTick Control and Status Register&#8212;&#8212;SysTick控制寄存器 SysTick Reload Value Register&#8212;&#8211;SysTick计数重载寄存器 SysTick Current Value Register&#8212;-SysTick当前值寄存器 SysTick Calibration Value Register&#8212;-SysTick校准值寄存器。 中间两个寄存器很好理解,当前值寄存器就是counter了,重载寄存器就是存计数值的地方. 第一个寄存器:控制寄存器, 这个寄存器的值需要特权模式(privileged mode)才可以操作.复位后默认值为0&#215;0000 0004. 其中位16,count flag,叫做计数标志,第当计数器计数到0一次,它就置为1,但读取该位的操作会使它变为0. 位2,clock source,是时钟源选择控制,为0时时钟源为AHB/8.为1时为AHB. 位1,TICKINT,用于控制计数器计数到0时是否产生中断.为0时不产生,为1时产生. 位0,EABLE,使能,用于开关这个定时器.为0关闭,为1开启. 0&#215;0000 0004,就是说默认是关闭状态,不产生中断状态,使用AHB时钟状态. 改变时钟源的操作在固件库里用的是void SysTick_CLKSourceConfig(u32 SysTick_CLKSource),可选值为:SysTick_CLKSource_HCLK和SysTick_CLKSource_HCLK_Div8. 库中总共六个函数,除了这个之外,还有五个: 二,void SysTick_CounterCmd(u32 SysTick_Counter), 可选值为SysTick_Counter_Enable,SysTick_Counter_Disable,SysTick_Counter_Clear.前两个操作分别是置位控制寄存器的使能位和将控制寄存器清0.第三个操作是将计数器的当前值清0. 三,u32 SysTick_GetCounter(void),这个函数返回计数值的当前值,即读计数器. 四,FlagStatus SysTick_GetFlagStatus(u8 SysTick_FLAG),可选值为 SysTick_FLAG_COUNT,SysTick_FLAG_SKEW, SysTick_FLAG_NOREF,分别代表要读取的三个位.返回值为SET或RESET. [...]]]></description>
			<content:encoded><![CDATA[<br/><p>Note:本文意在完整地解读STM32的定时器,为在本文水平有限的前提下达成此目地,本文中参考了很多其他网友的文字,若有不当之处,敬请指正.</p>
<p>Q：为何要使用SysTick定时器?</p>
<p>大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,这个滴答中断将用作系统时间片轮转的参考时间，用以实现任务的正常调度. 因此，需要一个定时器来产生周期性的中断，而且最好还让用户程序不能随意访问它的寄存器，以维持操作系统“心跳”的节律。<br />
当然,如果不用操作系统的话,这个定时器也可以用做其他用途,如闹铃等.</p>
<p>Q: SysTick有何不同,为什么非这个也不用普通的?<br />
STM32的SysTick属于其16个不可屏蔽中断之一（占有不可屏蔽中断向量位置）.不同于一般的中断.</p>
<p>Q：Systick如何运行？<br />
SysTick具有四专门的管理寄存器：<br />
SysTick Control and Status Register&#8212;&#8212;SysTick控制寄存器<br />
SysTick Reload Value Register&#8212;&#8211;SysTick计数重载寄存器<br />
SysTick Current Value Register&#8212;-SysTick当前值寄存器<br />
SysTick Calibration Value Register&#8212;-SysTick校准值寄存器。<br />
中间两个寄存器很好理解,当前值寄存器就是counter了,重载寄存器就是存计数值的地方.<br />
第一个寄存器:控制寄存器,</p>
<p><a title="Flickr 上 Dean Sinaean 的 SysTick-Control-status-register" href="http://www.flickr.com/photos/deansinaean/4770597645/"><img src="http://76.13.18.79/4098/4770597645_7eedcd00ca_z.jpg" alt="SysTick-Control-status-register" width="640" height="146" /></a><br />
这个寄存器的值需要特权模式(privileged mode)才可以操作.复位后默认值为0&#215;0000 0004.<br />
其中位16,count flag,叫做计数标志,第当计数器计数到0一次,它就置为1,但读取该位的操作会使它变为0.<br />
位2,clock source,是时钟源选择控制,为0时时钟源为AHB/8.为1时为AHB.<br />
位1,TICKINT,用于控制计数器计数到0时是否产生中断.为0时不产生,为1时产生.<br />
位0,EABLE,使能,用于开关这个定时器.为0关闭,为1开启.<br />
0&#215;0000 0004,就是说默认是关闭状态,不产生中断状态,使用AHB时钟状态.</p>
<p>改变时钟源的操作在固件库里用的是void SysTick_CLKSourceConfig(u32 SysTick_CLKSource),可选值为:SysTick_CLKSource_HCLK和SysTick_CLKSource_HCLK_Div8.</p>
<p>库中总共六个函数,除了这个之外,还有五个:<br />
二,void SysTick_CounterCmd(u32 SysTick_Counter),<br />
可选值为SysTick_Counter_Enable,SysTick_Counter_Disable,SysTick_Counter_Clear.前两个操作分别是置位控制寄存器的使能位和将控制寄存器清0.第三个操作是将计数器的当前值清0.</p>
<p>三,u32 SysTick_GetCounter(void),这个函数返回计数值的当前值,即读计数器.</p>
<p>四,FlagStatus SysTick_GetFlagStatus(u8 SysTick_FLAG),可选值为 SysTick_FLAG_COUNT,SysTick_FLAG_SKEW, SysTick_FLAG_NOREF,分别代表要读取的三个位.返回值为SET或RESET.</p>
<p>五,void SysTick_ITConfig(FunctionalState NewState),用于设定时钟是否产生中断,可选值为ENABLE和DISABLE.</p>
<p>六,void SysTick_SetReload(u32 Reload),设置重装载寄存器值.不得大于24位大小.</p>
<p>另外,那个重载寄存器还有些说法.它的值要在0&#215;0000 0000到0x00FF FFFF之间.这个值可以为0的,但是为零时没有任何作用,因为中断的产生和count flag标志的改变都是基本从1数到0的跳变的.<br />
手册中还提到:重载寄存器的值根据使用目的不同,计算方法也不同.第一.当用于产生multi-shot timer时,要写N-1.第二,当用于产生单个系统时钟中断的时,则要写N.但是这两种模式看不懂啊.不懂是怎么回事.有人明白的说一下吧.我找资料没找到.</p>
<p>使用SysTick时钟的一般步骤为:<br />
一,设置计数器时钟源，CTRL-&gt;CLKSOURCE（控制寄存器）。使用固件库即为:SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);或SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);<br />
二,设置重载值（RELOAD寄存器）.使用固件库为:SysTick_SetReload(计数个数值-1);<br />
三,清空计数寄存器VAL。SysTick_CounterCmd(SysTick_Counter_Clear);<br />
最后一步,使能计数器,开始计时.置CTRL-&gt;ENABLE位。SysTick_CounterCmd(SysTick_Counter_Enable);<br />
如果要使用中断则允许Systick中断，在中断例程中处理。SysTick_ITConfig(ENABLE);<br />
如果采用查询模式则不断读取控制寄存器的COUNTFLAG标志位，判断是否计时至零。SysTick_GetFlagStatus(SysTick_FLAG_COUNT);</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://www.usr.cc/go/?p=85" rel="bookmark" class="crp_title">lcd1602写指令和数据时序代码之一&#8211;写数据.</a></li><li><a href="http://www.usr.cc/go/?p=89" rel="bookmark" class="crp_title">lcd1602写指令和数据时序代码之二–写指令.</a></li><li><a href="http://www.usr.cc/go/?p=96" rel="bookmark" class="crp_title">试试flickr manager</a></li><li><a href="http://www.usr.cc/go/?p=100" rel="bookmark" class="crp_title">今天终于成功地把discuz!X1的发帖按钮给改了</a></li><li><a href="http://www.usr.cc/go/?p=130" rel="bookmark" class="crp_title">金山快盘使用体验</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.usr.cc/go/?feed=rss2&amp;p=116</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>金山实验室发布云存储服务：金山快盘</title>
		<link>http://www.usr.cc/go/?p=106</link>
		<comments>http://www.usr.cc/go/?p=106#comments</comments>
		<pubDate>Tue, 06 Jul 2010 11:02:14 +0000</pubDate>
		<dc:creator>Dean Sinaean</dc:creator>
				<category><![CDATA[博闻]]></category>
		<category><![CDATA[wps]]></category>
		<category><![CDATA[金山]]></category>
		<category><![CDATA[网盘]]></category>

		<guid isPermaLink="false">http://www.usr.cc/go/?p=106</guid>
		<description><![CDATA[<br/>今天听嘀咕上的网友提到了金山快盘,也看了一下,在官方博客上看到已经可以提供10G的空间了,不过现在还要邀请注册.邀请注册很简单,输入你的邮箱就可以了,但是问题是他们要七个工作日内才能发给你. 先申请了一下,还没得到. 比起金山WPS Office 2010个人版提供的网络存储功能，它具有以下特点： 1.无需安装WPS，直接下载1.6M的快盘，像操作本地文件夹一样使用它； 2.自动实时差异同步：无论你使用台式机或笔记本，只要绑定同一账号，快 盘的文件就可以实时同步。如果你还在用Email或U盘来同步文档，真的OUT了； 3.建立与用户之间的沟通渠道。点击快盘右键菜单&#124;查看历史消 息，可以看到一个类似微博的网络办公空间。你可以直接查看收到的共享文档内容、参与评论。据说还会整合群功能，让用户在半私有化的空间内更加顺畅的沟通。 了解快盘的更多信息，可以访问官方博客地址：http://k.wps.cn No related posts found]]></description>
			<content:encoded><![CDATA[<br/><p>今天听嘀咕上的网友提到了金山快盘,也看了一下,在官方博客上看到已经可以提供10G的空间了,不过现在还要邀请注册.邀请注册很简单,输入你的邮箱就可以了,但是问题是他们要七个工作日内才能发给你.<br />
先申请了一下,还没得到.<br />
比起金山WPS Office 2010个人版提供的网络存储功能，它具有以下特点：</p>
<p>1.无需安装WPS，直接下载1.6M的快盘，像操作本地文件夹一样使用它；<br />
2.自动实时差异同步：无论你使用台式机或笔记本，只要绑定同一账号，快 盘的文件就可以实时同步。如果你还在用Email或U盘来同步文档，真的OUT了；<br />
3.建立与用户之间的沟通渠道。点击快盘右键菜单|查看历史消 息，可以看到一个类似微博的网络办公空间。你可以直接查看收到的共享文档内容、参与评论。据说还会整合群功能，让用户在半私有化的空间内更加顺畅的沟通。</p>
<p>了解快盘的更多信息，可以访问官方博客地址：http://k.wps.cn</p>
<div id="crp_related"><p>No related posts found</p></div>]]></content:encoded>
			<wfw:commentRss>http://www.usr.cc/go/?feed=rss2&amp;p=106</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
